一、服務發現與消費
通過上面的內容與實踐,我們已經搭建起微服務架構中的核心組件——服務註冊中心(包括單點模式和高可用模式)。並且成功的將服務註冊到了註冊中心上,現在我們已經有了服務註冊中心和服務提供者,下面我們會構建一個服務消費者,他主要有兩個功能:發現服務,消費服務。其中,服務發現的任務是由Eureka的客戶端完成的,服務消費的任務是由Ribbon完成。Ribbon是一個基於HTTP和TCP的客戶端負載均衡器,他可以通過配置在客戶端中的ribbonServerList服務端列表去輪詢訪問達到負載均衡的作用。當ribbon和Eureka聯合使用時,ribbon的服務實例清單RibbonServerList會被DiscoveryEnabledNIWSServerList重寫,擴展成從Eureka註冊中心獲取服務列表。同時他也會用NIWSDiscoveryPing來取代IPing,他將責任委託給Eureka來確定服務端是否啓動!
二、將eureka-service-hello服務註冊兩個實例
打包啓動eureka-service-hello:
java -jar eureka-service-hello.jar --spring.profiles.active=hello1
java -jar eureka-service-hello.jar --spring.profiles.active=hello2
查看註冊中心:
我們可以看見有兩個註冊中心,兩個eureka-service-hello。
三、構建服務消費者
創建一個新的工程,名字叫做:ribbon-consumer-hello,pom.xml配置
<?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" <modelVersion>4.0.0</modelVersion> <groupId>com.wl.test</groupId> <artifactId>ribbon-consumer-hello</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>ribbon-consumer-hello</name> <description>服務消費者,消費hello服務</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.10.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>Dalston.SR5</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-ribbon</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> </project> |
新增了一個spring-cloud-starter-ribbon依賴。
配置application.yml
修改啓動類:
通過@LoadBalanced開啓客戶端負載均衡!
新增controller:這裏是根據你配置的 spring.application.name 來進行查找服務。
注意:這個 spring.application.name 是服務名,不是instance-id,一個服務可能有很多實例,所有一個 spring.application.name 可以對應很多的instance-id。
測試服務消費者:
第一次訪問:
第二次訪問:
可以看見,我們進行了客戶端的負載均衡!nginx的反向代理和LVS屬於服務端的負載均衡。
什麼是客戶端的負載均衡:就是客戶(在這裏是eureka的服務消費者)知道自己調用的是哪個服務實例,決定權在客戶手中
什麼是服務端的負載均衡:比如nginx的反向代理就是典型的服務端負載均衡,用戶只需要訪問nginx服務器,完全不瞭解具體是哪臺服務器響應的自己,決定權在服務端手裏!