SpringCloud微服務架構最簡單粗暴講解之Ribbon使用篇
我們繼續使用《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
我們spring-cloud-parent 父工程 與Eureka Server 服務
spring-cloud-eureka-server不需要動,然後分別啓動9090端口與9091端口的Eureka Server。
我們這裏使用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啓動
修改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;
}
}
分別啓動訂單服務提供者 7070 與7071 服務,我們可以看到兩個服務提供者註冊到Eureka Server 上面了。
訂單調用者服務:
spring-cloud-user-service-consumer:8080
我們需要在RestTemplate配置類裏面在注入RestTemplate的方法上面添加註解@LoadBalanced
@Configuration
public class RestTemplateConfiguration {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
這就ok了,我們這裏不需要添加Ribbon的依賴,因為Eureka Client包裏面幫我們引入Ribbon相關的依賴。
這裏我們只需要在調用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);
}
}
我們調用兩次,分別返回7071與7070,説明我們Ribbon起作用了。
我們這邊默認的負載均衡策略是:ZoneAvoidanceRule:區域權衡策略。然後我們可以通過配置來使用其他的負載均衡策略,比如我們使用隨機策略:
application.yml中配置
這個是針對
spring-cloud-order-service-provider 這個服務的。
spring-cloud-order-service-provider:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule