1.Ribbon概述
1.1.Ribbon是什么
SpringCloud Ribbon是基于Netflix Ribbon實作的一套基于客戶端Client的負載均衡工具,
Ribbon主要的功能是提供客戶端的軟體負載均衡演算法,將Netflix的中間層服務連接在一起,提供一系列完善的配置項如連接超時、重試等,
簡單地說,就是在組態檔中列出Load Balancer(LB)后面所有的機器,Ribbon會自動地幫助你基于某種規則(如簡單輪詢、隨機連接等)去連接這些機器,
1.2.負載均衡LB分類
集中式LB:
在服務的消費方和提供方之間使用獨立的LB設施(可以是硬體(F5),也可以是軟體(nginx)),由這些設施負責把訪問請求通過某種策略轉發至服務的提供方,(相當于公務員考公,國家選舉)
行程內LB:
將LB的邏輯集成到消費方,消費方從服務注冊中心獲知有哪些地址可用,然后自己在從這些地址中選擇出一個合適的服務器,(相當于客戶點餐選擇人少的取餐點取餐)
Ribbon就屬于行程內LB,它只是一個類別庫,集成于消費方行程,消費方通過它來獲取服務提供方的地址,
2.Ribbon 客戶端配置
2.1.pom.xml
<!--引入Ribbon相關:ribbon->eureka->config--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-ribbon</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <!--微服務provider方引入eureka--> <dependency> <groupId>org.springframework.cloud</groupId> <!--沒有帶sever表示就是client客戶端--> <artifactId>spring-cloud-starter-eureka</artifactId> <version>1.4.6.RELEASE</version> </dependency>
2.2.application.yml
server:
#80埠被占用,選擇了81測驗
port: 81
#spring的配置
spring:
application:
name: springcloud-consumer-dept #默認注冊進eureka中的實體名稱(顯示大寫)
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: org.gjt.mm.mysql.Driver
url: jdbc:mysql://localhost:3306/springcloud_db01?useUnicode=true&characterEncoding=utf-8
username: root
password: admin
#eureka的配置,確定客戶端服務注冊到eureka服務串列內
eureka:
client:
register-with-eureka: false #不向eureka注冊自己
service-url: #使用eureka集群測驗
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
2.3.啟動類及配置類
在consumer客戶端的配置類上加上@LoadBanlanced,表示當前的請求在客戶端做負載均衡;
@Configuration public class SpringBeanConfig { @Bean @LoadBalanced //Ribbon基于客戶端做負載均衡 public RestTemplate getRestTemplate(){ return new RestTemplate(); } }
@RestController public class DeptConsumerController { @Autowired private RestTemplate restTemplate; //服務端的請求地址,這里是本機localhost,也可以是其他任意的服務機ip地址 //private static final String REST_URL_PREFIX = "http://localhost:8001"; //負載均衡后通過服務名來獲取,因為由客戶端選舉定位到隨機的一個Eureka注冊中心去訪問 private static final String REST_URL_PREFIX = "http://SPRINGCLOUD-PROVIDER-DEPT"; }
啟動測驗訪問介面:http://localhost:8002/consumer/dept/get/2,訪問成功,

總結:Ribbon和Eureka整合后consumer可以直接呼叫服務而不用關心地址和埠號,
3.Ribbon負載均衡配置
Ribbon的負載均衡實作策略主要有:輪詢、隨機、重試三種,下面演示Ribbon的負載均衡,采用創建三個服務提供方的方式,并啟用三個Eureka服務注冊地址,具體思路圖如下:

3.1.請求提供者Provider創建
這里每個請求者都是一個單體服務,擁有自己獨立的資料庫,訪問介面,但是提供暴露到注冊中心的實體名是唯一的,用于客戶端來做訪問地址的唯一請求,而Ribbon則會通過@LoadBalanced注解對應識別客戶端請求查詢可用的服務串列,呼叫對應的負載均衡策略,
(1)單個的provider中主要的application.yml配置:
server: port: 8001 #mybatis的配置 mybatis: type-aliases-package: com.fengye.springcloud.pojo mapper-locations: classpath:mybatis/mapper/*Mapper.xml configuration: map-underscore-to-camel-case: true #spring的配置 spring: application: name: springcloud-provider-dept #默認注冊進eureka中的實體名稱(多個服務提供方應該唯一) datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: org.gjt.mm.mysql.Driver url: jdbc:mysql://localhost:3306/springcloud_db01?useUnicode=true&characterEncoding=utf-8 #db01/02/03 username: root password: admin #eureka的配置,確定客戶端服務注冊到eureka服務串列內 eureka: client: service-url: #集群配置 defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
(2)在服務提供方provider的Controller設定請求的呼叫介面,同時設定負載均衡埠資訊:
@RestController @RequestMapping("/dept") public class DeptController { @Autowired private DeptService service; //集群情況下,用于訂單服務查看到底呼叫的是哪個商品微服務節點 @Value("${server.port}") private String port; @GetMapping("/queryById/{id}") public Dept queryById(@PathVariable("id") Long id){ Dept dept = service.queryById(id); Dept result = new Dept(); BeanUtils.copyProperties(dept, result); result.setDname(result.getDname() + " data from port=" + port); //查看員工屬于哪個埠 System.out.println(result.getDname()); return result; }; }
3.2.服務呼叫方接收并測驗
(1)請求呼叫controller介面撰寫:
@RestController public class DeptConsumerController { /** * 消費者:不應該有service實作層 * RestTemplate:提供多種便捷的訪問遠程http服務的方法,提供簡單的restful服務模板(使用簡單無腦粗暴) * 引數型別:(url, requestMap, ResponseBean.class)分別代表REST請求地址、請求引數、HTTP回應轉換被轉換成的物件型別 */ @Autowired private RestTemplate restTemplate; //負載均衡后通過服務名來獲取 private static final String REST_URL_PREFIX = "http://SPRINGCLOUD-PROVIDER-DEPT"; @RequestMapping("/consumer/dept/get/{id}") public Dept get(@PathVariable("id") Long id){ Dept result = restTemplate.getForObject(REST_URL_PREFIX + "/dept/queryById/" + id, Dept.class); System.out.println("客戶端請求:data from port= " + result.getDname()); return result; } }
(2)服務呼叫方獲取并請求呼叫請求埠,獲取并列印訪問的埠資訊,連續多請求幾次:

控制臺列印:

可以看到每次訪問請求的埠都在不停變化,客戶端consumer基于Ribbon實作了負載均衡,
Ribbon檔案相關:
https://github.com/Netflix/ribbon
示例代碼已上傳至Github地址:
https://github.com/devyf/SpringCloud_Study/tree/main/springcloud_hello
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/272133.html
標籤:其他
上一篇:計算機入門知識基礎
