2019獨角獸企業重金招聘Python工程師標準>>>
一、Ribbon簡介
????Ribbon是Netflix發布的開源項目,主要功能是提供客戶端的軟件負載均衡算法,將Netflix的中間層服務連接在一起。Ribbon客戶端組件提供一系列完善的配置項如連接超時,重試等。簡單的說,就是在配置文件中列出Load Balancer后面所有的機器,Ribbon會自動的幫助你基于某種規則(如簡單輪詢,隨即連接等)去連接這些機器。我們也很容易使用Ribbon實現自定義的負載均衡算法。
二、準備工作
????這一篇文章基于上一篇文章的工程,啟動eureka-server 工程;啟動user-service工程,它的端口為8084;將user-service的項目復制出來一個將其名稱修改為user-service1,配置文件的端口改為8085.
?
?
啟動,這時你會發現:user-service在eureka-server注冊了2個實例,這就相當于一個小的集群。訪問localhost:1001如圖所示:
三、建一個服務消費者(Ribbon)
????重新新建一個工程,取名為:da-ribbon-service;?
????在它的pom.xml文件分別引入起步依賴spring-boot-starter-web,代碼如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>da-ribbon-server</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>da-ribbon-server</name><description>Demo project for Spring Boot</description><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.0.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version><spring-cloud.version>Finchley.M8</spring-cloud.version></properties><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-ribbon</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build><repositories><repository><id>spring-milestones</id><name>Spring Milestones</name><url>https://repo.spring.io/milestone</url><snapshots><enabled>false</enabled></snapshots></repository></repositories></project>
????在工程的配置文件指定服務的注冊中心地址為http://localhost:1001/eureka/,程序名稱為 ribbon-service,程序端口為2001。配置文件application.yml如下:
eureka:client:serviceUrl:defaultZone: http://localhost:1001/eureka/instance:lease-renewal-interval-in-seconds: 30
server:port: 2001
spring:application:name: ribbon-service
????在工程的啟動類中,通過@EnableEurekaClient向服務中心注冊;并且向程序的ioc注入一個bean: restTemplate;并通過@LoadBalanced注解表明這個restRemplate開啟負載均衡的功能。
@EnableEurekaClient
@SpringBootApplication
public class DaRibbonServerApplication {public static void main(String[] args) {SpringApplication.run(DaRibbonServerApplication.class, args);}@Bean@LoadBalancedRestTemplate restTemplate(){return restTemplate();}
}
寫一個測試類HelloService,通過之前注入ioc容器的restTemplate來消費service-hi服務的“/hi”接口,在這里我們直接用的程序名替代了具體的url地址,在ribbon中它會根據服務名來選擇具體的服務實例,根據服務實例在請求的時候會用具體的url替換掉服務名,代碼如下:
@Service
public class HelloService {@AutowiredRestTemplate restTemplate;public String getHello(String name){return restTemplate.getForObject("http://user-service/hi?name="+name,String.class);}
}
寫一個controller,在controller中用調用HelloService 的方法,代碼如下:
@RestController
public class HiController {@AutowiredHelloService helloService;@RequestMapping("/hi")public String hi(@RequestParam String name){return helloService.getHello(name);}
}
在瀏覽器上多次訪問http://localhost:2001/hi?name=zhangsan,瀏覽器交替顯示:
這說明當我們通過調用restTemplate.getForObject("http://user-service/hi?name="+name,String.class)方法時,已經做了負載均衡,訪問了不同的端口的服務實例。
四、此時的架構
- 一個服務注冊中心,eureka-server,端口為1001
- user-service跑了兩個工程實例,端口分別為8084,8085,分別向服務注冊中心注冊
- ribbon-sercvice端口為2001,向服務注冊中心注冊
- 當ribbon-sercvice通過restTemplate調用user-service的hi接口時,因為用ribbon進行了負載均衡,會輪流的調用user-service:8084和8085 兩個端口的hi接口;
五、源碼下載
????RibbonServer源碼下載:https://gitee.com/Clarences/Ribbon-Service
????UserServer1源碼下載:https://gitee.com/Clarences/User-server1