原文連接: https://blog.csdn.net/nanbiebao6522/article/details/80574463前端
就不重複造輪子了, 如下是原文:java
Spring Boot做爲目前最火爆的web框架。那麼它與Eureka又有什麼關聯呢?web
Eureka是Netflix開源的一個RESTful服務,主要用於服務的註冊發現。
Eureka由兩個組件組成:Eureka服務器和Eureka客戶端。Eureka服務器用做服務註冊服務器。
Eureka客戶端是一個java客戶端,用來簡化與服務器的交互、做爲輪詢負載均衡器,並提供服務的故障切換支持。
Netflix在其生產環境中使用的是另外的客戶端,它提供基於流量、資源利用率以及出錯狀態的加權負載均衡。spring
這裏須要用到spring-cloud的Eureka模塊,他是一個服務的註冊和發現模塊
如圖咱們先new一個Spring-boot工程引入Eureka Serverapache
Next>>>>Finish完成瀏覽器
咱們來看看構建好的Eureka-Server的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" 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.eureka</groupId> <artifactId>server</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>server</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.2.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.RC2</spring-cloud.version> </properties> <dependencies> <!-- 引入的Eureka-server --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId> </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>
咱們看到這裏與普通的Spring-boot項目不一樣的是,這裏引用了一個Eureka-Server包。
那麼咱們怎麼使用它呢,怎麼啓動它呢?app
這裏只須要啓動一個註解就能夠啦,咱們在Spring-Boot工程的啓動類上加>>>>>>
@EnableEurekaServer
代碼以下:
負載均衡
package com.eureka.server; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; /** * 啓動一個服務註冊中心 */ @EnableEurekaServer @SpringBootApplication public class ServerApplication { public static void main(String[] args) { SpringApplication.run(ServerApplication.class, args); } }
差點忘了,咱們還須要配置application.yml框架
Eureka是一個高可用的組件,每個實例註冊以後須要向註冊中心發送心跳包,在默認狀況下erureka server也是一個eureka client ,必需要指定一個 server。
eureka server的配置文件appication.yml:
server: port: 8081 #服務註冊中心端口號 eureka: instance: hostname: 127.0.0.1 #服務註冊中心IP地址 client: registerWithEureka: false #是否向服務註冊中心註冊本身 fetchRegistry: false #是否檢索服務 serviceUrl: #服務註冊中心的配置內容,指定服務註冊中心的位置 defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
咱們來啓動一下吧
咱們在瀏覽器上輸入http://127.0.0.1:8081
咱們能夠看到它的可視化界面
細心的朋友會發現,這裏沒有發現服務???No instance available
why? 由於咱們尚未服務向註冊中心註冊服務,因此找不到啊。
客戶端在向註冊中心它會提供一些元數據,例如主機和端口,URL,主頁等。Eureka server 從 每 個client實例接收心跳消息。 若是心跳超時,則一般將該實例從註冊server中刪除。
建立客戶端和服務端差很少,只是啓動註解有點不同,還有yml配置文件
Next>>>Finish完成啦
打開會發現pom.xml其實和Server註冊中心的相似
<?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.eureka</groupId> <artifactId>provider</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>provider</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.2.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.RC2</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-netflix-eureka-server</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>
怎麼證實它是Client呢
很簡單
在Spring-boot的啓動類上經過註解@EnableEurekaClient 代表本身是一個eurekaclient.
package com.eureka.provider; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import java.util.HashMap; import java.util.Map; /** * Eureka客戶端 */ @RestController @EnableEurekaClient @SpringBootApplication public class ProviderApplication { public static void main(String[] args) { SpringApplication.run(ProviderApplication.class, args); } /** * 假如這個客戶端要提供一個getUser的方法 * @return */ @GetMapping(value = "/getUser") @ResponseBody public Map<String,Object> getUser(@RequestParam Integer id){ Map<String,Object> data = new HashMap<>(); data.put("id",id); data.put("userName","admin"); data.put("from","provider-A"); return data; } }
雖然加好了@EnableEurekaClient,總感受差點什麼,對了,配置文件yml
eureka: client: serviceUrl: #註冊中心的註冊地址 defaultZone: http://127.0.0.1:8081/eureka/ server: port: 8082 #服務端口號 spring: application: name: service-provider #服務名稱--調用的時候根據名稱來調用該服務的方法
咱們來啓動看看吧
咱們看到這個客戶端已經向註冊中心註冊服務了,那麼咱們打開Eureka-server
咱們看到咱們啓動的服務是否是加進去了呢
咱們看到咱們的服務是否是加進去了呢。
那麼有人會問,那一大堆飆紅的什麼意思啊。由於註冊的服務都是高可用的,這裏只檢測到一個服務,產生的預警,不影響使用,等下咱們啓動多個實例就不會了。
咱們先來測試下客戶端的方法是否可用
顯然是沒有問題,那麼咱們提供好了服務,sei來消費呢?
下面咱們就來創建一個消費者
爲了更簡單易懂,我仍是一步一步出圖吧。
來,貼上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" 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.eureka</groupId> <artifactId>consumer</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>consumer</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.2.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.RC2</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-netflix-eureka-server</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>
主要是啓動類,裏面內容就豐富啦,都在註釋裏
package com.eureka.consumer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.context.annotation.Bean; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; import java.util.HashMap; import java.util.Map; /** * Eureka客戶端-消費者 */ @RestController @EnableEurekaClient @SpringBootApplication public class ConsumerApplication { @Autowired RestTemplate restTemplate; public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args); } /** * 實例化RestTemplate * @return */ @LoadBalanced @Bean public RestTemplate rest() { return new RestTemplate(); } /** * Rest服務端使用RestTemplate發起http請求,而後獲得數據返回給前端----gotoUser是爲了區分getUser怕小夥伴暈頭 * @param id * @return */ @GetMapping(value = "/gotoUser") @ResponseBody public Map<String,Object> getUser(@RequestParam Integer id){ Map<String,Object> data = new HashMap<>(); /** * 小夥伴發現沒有,地址竟然是http://service-provider * 竟然不是http://127.0.0.1:8082/ * 由於他向註冊中心註冊了服務,服務名稱service-provider,咱們訪問service-provider便可 */ data = restTemplate.getForObject("http://service-provider/getUser?id="+id,Map.class); return data; } }
配置文件
eureka: client: serviceUrl: #註冊中心的註冊地址 defaultZone: http://127.0.0.1:8081/eureka/ server: port: 8083 #服務端口號 spring: application: name: service-consumer #服務名稱--調用的時候根據名稱來調用該服務的方法
咱們啓動看看效果吧
看看咱們的提供者和消費者是否是都進來了
那麼咱們看看咱們消費者的方法是否可用
哈哈,是否是很神奇
下面介紹個更神奇的東西--實現微服務負載均衡
咱們把服務提供者複製一個工程出來,咱們再作下小小的修改,看看是否能實現負載均衡。
咱們須要修改兩個文件
一個是啓動類,改了哪些呢?看看就曉得咯
package com.eureka.provider; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import java.util.HashMap; import java.util.Map; /** * Eureka客戶端 */ @RestController @EnableEurekaClient @SpringBootApplication public class ProviderApplication { public static void main(String[] args) { SpringApplication.run(ProviderApplication.class, args); } /** * 假如這個客戶端要提供一個getUser的方法 * @return */ @GetMapping(value = "/getUser") @ResponseBody public Map<String,Object> getUser(@RequestParam Integer id){ Map<String,Object> data = new HashMap<>(); data.put("id",id); data.put("userName","admin"); data.put("from","provider-B");//改這裏是爲了讓你們更能理解它負載均衡的機制 return data; } }
還有就是yml配置文件
eureka: client: serviceUrl: #註冊中心的註冊地址 defaultZone: http://127.0.0.1:8081/eureka/ server: port: 8088 #服務端口號--該端口不要衝突 spring: application: name: service-provider #服務名稱--調用的時候根據名稱來調用該服務的方法--名字絕對不能改,改了就訪問不到了
咱們來啓動一下吧
看看Eureka-server後臺的效果 ServerA ServerB
這個叫作Service-provider是否是有兩個實例啊
那麼,咱們分別訪問一下,看看效果怎麼樣
看到了嗎,8082端口,from是provider-A,8088端口,from是provider-B.
那麼咱們訪問消費者的服務器看看會出現什麼樣的狀況呢 飛機直達
一開始是from A,你刷新一下,誒? 變成 from B了。
說明這個時候兩臺提供者在交替工做,從而達到了一個負載均衡的做用。
來來來,我給你畫個圖
每一個微服務都是一個Eureka-Client,咱們把每一個app(SpringBootApplication)都向註冊中心註冊一個服務。
有時候,某個服務的工做量比較大的時候,咱們能夠多註冊幾個同名稱的微服務,從而讓他們交替工做,減輕單個服務的壓力。
寫到這裏就結束咯。
明天還要上班呢。
有哪裏不對的地方,但願你們幫忙指正。