一、ribbon簡介 git
spring cloud的Netflix中提供了兩個組件實現軟負載均衡調用:ribbon和feign。github
Ribbon 是一個基於 HTTP 和 TCP 客戶端的負載均衡器web
它能夠在客戶端配置 ribbonServerList(服務端列表),而後輪詢請求以實現均衡負載spring
它在聯合 Eureka 使用時apache
ribbonServerList 會被 DiscoveryEnabledNIWSServerList 重寫,擴展成從 Eureka 註冊中心獲取服務端列表瀏覽器
同時它也會用 NIWSDiscoveryPing 來取代 IPing,它將職責委託給 Eureka 來肯定服務端是否已經啓動架構
二、啓動多個client實例app
中止eureka-client服務,打開Run/Debug Configurations
負載均衡
把圖中勾選取消,而後保存,啓動,此時啓動端口爲8762,打開配置文件,將端口修改成8763,再次啓動,能夠看到在註冊中心啓動了兩個服務maven
三、建立服務消費者service-ribbon
<?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.study</groupId> <artifactId>service-ribbon</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>service-ribbon</name> <description>Demo project for Spring Boot</description> <parent> <groupId>com.study</groupId> <artifactId>cloud</artifactId> <version>1.0-SNAPSHOT</version> </parent> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency> </dependencies> </project>
配置文件
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
server:
port: 8764
spring:
application:
name: service-ribbon
在工程的啓動類中,經過@EnableDiscoveryClient向服務中心註冊;而且向程序的ioc注入一個bean: restTemplate;並經過@LoadBalanced註解代表這個restRemplate開啓負載均衡的功能。
@EnableEurekaClient @EnableDiscoveryClient @SpringBootApplication public class ServiceRibbonApplication { public static void main(String[] args) { SpringApplication.run(ServiceRibbonApplication.class, args); } @Bean @LoadBalanced RestTemplate restTemplate() { return new RestTemplate(); } }
寫一個測試類HelloService,經過以前注入ioc容器的restTemplate來消費service-hi服務的「/hi」接口,在這裏咱們直接用的程序名替代了具體的url地址,
在ribbon中它會根據服務名來選擇具體的服務實例,根據服務實例在請求的時候會用具體的url替換掉服務名,代碼以下:
@Service public class HelloService { @Autowired RestTemplate restTemplate; public String hiService(String name) { return restTemplate.getForObject("http://SERVICE-HI/hi?name="+name,String.class); } }
寫一個controller,在controller中用調用HelloService 的方法,代碼以下:
@RestController public class HelloControler { @Autowired HelloService helloService; @GetMapping(value = "/hi") public String hi(@RequestParam String name) { return helloService.hiService( name ); } }
啓動工程,在瀏覽器中訪問http://localhost:8764/hi?name=study 瀏覽器交替顯示:
hi study ,i am from port:8762
hi study ,i am from port:8763
這說明當咱們經過調用restTemplate.getForObject(「http://SERVICE-HI/hi?name=「+name,String.class)方法時,已經作了負載均衡,訪問了不一樣的端口的服務實例。
四、此時的架構
五、架構分析
5.一、看實線部分,service-hi 876二、service-hi 8763 和 service-ribbon 8764都做爲服務消費者分別向服務註冊中心eureka-server 8761中註冊。
5.二、看虛線部分,當sercvice-ribbon經過restTemplate調用service-hi的hi接口時,由於用ribbon進行了負載均衡,會輪流的調用service-hi:8762和8763 兩個端口的hi接口。