ribbon實作步驟
- 一:建立eureka,兩個producter服務(不做介紹),一個ribbon服務
- 二:ribbon服務
- pom
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
<version>1.4.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
- application.properties配置
server.port= 9010
spring.application.name= server-ribbon
eureka.client.serviceUrl.defaultZone=http://127.0.0.1:9000/eureka
- 建立collection
@RestController
public class TestController {
@Autowired
private LoadBalancerClient loadBalancerClient;
@RequestMapping("/test")
public String test() throws ExecutionException, InterruptedException {
//server-producer為 producer服務的 spring.application.name=server-producer
//兩個服務的名稱一緻,端口不一緻,(本demo分别為:9101和9101)
ServiceInstance serviceInstance = loadBalancerClient.choose("server-producer");
//負載均衡算法預設是輪詢,輪詢取得服務
URI uri = URI.create(String.format("http://%s:%s", serviceInstance.getHost(), serviceInstance.getPort()));
return uri.toString();
}
}
-
啟動服務進行測試
浏覽器通路 http://localhost:9010/test
出現不同端口
- 三:實作簡單的接口調用
- 在原有基礎上進行添加,(本例中兩個producter服務,接口路徑,服務名均相同,除端口,test接口傳回值不同,其餘相同)
- application.properties配置添加
server.port= 9010
spring.application.name= server-ribbon
eureka.client.serviceUrl.defaultZone=http://127.0.0.1:9000/eureka
//為特定的服務配置負載均衡政策(server-producer服務名)
server-producer.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
- 在ribbon服務啟動類添加,和@EnableDiscoveryClient注解
@SpringBootApplication
@EnableDiscoveryClient
public class RibbonApplication {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(RibbonApplication.class, args);
}
}
- 在testCollection添加test1方法
@Autowired
private LoadBalancerClient loadBalancerClient;
//注入 RestTemplate
@Autowired
private RestTemplate restTemplate;
@GetMapping("/test1")
public String test1() {
ServiceInstance serviceInstance = loadBalancerClient.choose("server-producer");
//http://這裡是服務名(server-producer)/這裡collection對應路徑(test)
String s = this.restTemplate.getForObject("http://server-producer/test", String.class);
return s+serviceInstance.getPort();
}
- 啟動測試 至此簡單的輪詢調用完成
結合 - 斷路器使用
- 當某一個服務出現當機,異常時可配置
- 添加pom
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
<version>1.4.5.RELEASE</version>
</dependency>
- 啟動類添加@EnableHystrix注解
- 修改testCollection
//fallbackMethod = "getServiceError" getServiceError為調用方法
@HystrixCommand(fallbackMethod = "getServiceError")
@GetMapping("/test1")
public String test1() {
ServiceInstance serviceInstance = loadBalancerClient.choose("server-producer");
String s = this.restTemplate.getForObject("http://server-producer/test", String.class);
return s+serviceInstance.getPort();
}
public String getServiceError() {
return "出現錯誤!!!!;調用getServiceError()";
}
-
啟動測試
依次啟動eureka,兩個producter,ribbon,能正常輪詢通路後,停掉其中一個producter服務,再次通路 http://localhost:9010/test1
當調用停止的服務時
正常時