楠木軒

SpringCloud微服務架構最簡單粗暴講解之Ribbon使用篇

由 東方崇學 發佈於 科技

1.環境準備

我們繼續使用《SpringCloud之Eureka使用篇》裏面Eureka集羣環境。

1.首先我這裏有spring-cloud-parent pom工程

2.spring-cloud-eureka-server Eureka Server 子工程 這裏端口我們使用90開頭

我們這裏集羣由兩個服務實例組成,分別是9090與9091端口

3.spring-cloud-user-service-consumer 用户服務 (也就是咱們的服務消費者)這裏端口我們使用80 開頭

4.spring-cloud-order-service-provider 訂單提供服務 (服務提供者) 這裏端口我們使用70開頭

我們訂單服務提供着也由兩個實例組成,分別是7070與7071

2. spring-cloud-eureka-server

我們spring-cloud-parent 父工程 與Eureka Server 服務
spring-cloud-eureka-server不需要動,然後分別啓動9090端口與9091端口的Eureka Server。

3.訂單服務(服務提供者)3.1 application.yml

我們這裏使用springboot profiles 配置文件特性將訂單提供者服務
spring-cloud-order-service-provider分成不同端口

spring:
application:
name: spring-cloud-order-service-provider
---
spring:
profiles: p1
eureka:
client:
service-url:
defaultZone: http://EurekaServerA:9090/eureka,http://EurekaServerB:9091/eureka
fetch-registry: true
register-with-eureka: true
instance:
prefer-ip-address: true # 使用ip註冊
#自定義實例顯示格式,添加版本號
instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}:@project.version@
server:
port: 7070
---
spring:
profiles: p2
eureka:
client:
service-url:
defaultZone: http://EurekaServerA:9090/eureka,http://EurekaServerB:9091/eureka
fetch-registry: true
register-with-eureka: true
instance:
prefer-ip-address: true # 使用ip註冊
#自定義實例顯示格式,添加版本號
instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}:@project.version@
server:
port: 7071

並配置idea啓動

3.2 controller

修改controller,讓其返回當前服務的端口,利於我們觀察

@RestController
@RequestMapping("/order/data")
public class OrderStatisticServiceController {
@Value("${server.port}")
private Integer port;
/**
* 根據用户id獲取今日完單數
* @param id 用户ID
* @return 完單數
*/
@GetMapping("/getTodayFinishOrderNum/{id}")
public Integer getTodayFinishOrderNum(@PathVariable("id") Integer id){
return port;
}
}

3.3 啓動

分別啓動訂單服務提供者 7070 與7071 服務,我們可以看到兩個服務提供者註冊到Eureka Server 上面了。

4.用户服務(服務調用者)

訂單調用者服務:
spring-cloud-user-service-consumer:8080

4.1 RestTemplateConfiguration

我們需要在RestTemplate配置類裏面在注入RestTemplate的方法上面添加註解@LoadBalanced

@Configuration
public class RestTemplateConfiguration {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}

這就ok了,我們這裏不需要添加Ribbon的依賴,因為Eureka Client包裏面幫我們引入Ribbon相關的依賴。

4.2 controller

這裏我們只需要在調用url中寫入要調用的服務名字就可以了,然後Ribbon就會幫我們從服務列表找到合適的服務調用的

@RestController
@RequestMapping("/user/data")
public class UserCenterController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/getTodayStatistic/{id}")
public Integer getTodayStatistic(@PathVariable("id") Integer id){
String url ="http://spring-cloud-order-service-provider/order/data/getTodayFinishOrderNum/"+id;
return restTemplate.getForObject(url, Integer.class);
}
}

4.3 啓動測試

我們調用兩次,分別返回7071與7070,説明我們Ribbon起作用了。

4.4 調整負載均衡策略

我們這邊默認的負載均衡策略是:ZoneAvoidanceRule:區域權衡策略。然後我們可以通過配置來使用其他的負載均衡策略,比如我們使用隨機策略:

application.yml中配置

這個是針對
spring-cloud-order-service-provider 這個服務的。

spring-cloud-order-service-provider:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule