網(wǎng)站建設(shè)和網(wǎng)袷宣傳參考網(wǎng)是合法網(wǎng)站嗎?
Eureka-注冊(cè)中心
Eureka簡(jiǎn)介
官方網(wǎng)址:
https://spring.io/projects/spring-cloud-netflix
Eureka介紹
Spring Cloud 封裝了 Netflix 公司開(kāi)發(fā)的 Eureka 模塊來(lái)實(shí)現(xiàn)服務(wù)注冊(cè)和發(fā)現(xiàn)(請(qǐng)對(duì)比Zookeeper)。Zooleeper nacos.
Eureka 采用了 C-S 的設(shè)計(jì)架構(gòu)。Eureka Server 作為服務(wù)注冊(cè)功能的服務(wù)器,它是服務(wù)注冊(cè)中心。而系統(tǒng)中的其他微服務(wù),使用 Eureka 的客戶(hù)端連接到 Eureka Server并維持心跳連接。這樣系統(tǒng)的維護(hù)人員就可以通過(guò) Eureka Server 來(lái)監(jiān)控系統(tǒng)中各個(gè)微服務(wù)是否正常運(yùn)行。SpringCloud 的一些其他模塊(比如Zuul)就可以通過(guò) Eureka Server 來(lái)發(fā)現(xiàn)系統(tǒng)中的其他微服務(wù),并執(zhí)行相關(guān)的邏輯。
Eureka包含兩個(gè)組件:Eureka Server和Eureka Client
Eureka Server提供服務(wù)注冊(cè)服務(wù)
各個(gè)節(jié)點(diǎn)啟動(dòng)后,會(huì)在EurekaServer中進(jìn)行注冊(cè),這樣EurekaServer中的服務(wù)注冊(cè)表中將會(huì)存儲(chǔ)所有可用服務(wù)節(jié)點(diǎn)的信息,服務(wù)節(jié)點(diǎn)的信息可以在界面中直觀(guān)的看到EurekaClient是一個(gè)Java客戶(hù)端,用于簡(jiǎn)化Eureka Server的交互,客戶(hù)端同時(shí)也具備一個(gè)內(nèi)置的、使用輪詢(xún)(round-robin)負(fù)載算法的負(fù)載均衡器。在應(yīng)用啟動(dòng)后,將會(huì)向Eureka Server發(fā)送心跳(默認(rèn)周期為30秒)。如果Eureka Server在多個(gè)心跳周期內(nèi)沒(méi)有接收到某個(gè)節(jié)點(diǎn)的心跳,EurekaServer將會(huì)從服務(wù)注冊(cè)表中把這個(gè)服務(wù)節(jié)點(diǎn)移除(默認(rèn)90秒)
Eureka基本原理

基本原理
上圖是來(lái)自eureka的官方架構(gòu)圖,這是基于集群配置的eureka;
- 處于不同節(jié)點(diǎn)的eureka通過(guò)Replicate進(jìn)行數(shù)據(jù)同步
- Application Service為服務(wù)提供者
- Application Client為服務(wù)消費(fèi)者
- Make Remote Call完成一次服務(wù)調(diào)用
服務(wù)啟動(dòng)后向Eureka注冊(cè),Eureka Server會(huì)將注冊(cè)信息向其他Eureka Server進(jìn)行同步,當(dāng)服務(wù)消費(fèi)者要調(diào)用服務(wù)提供者,則向服務(wù)注冊(cè)中心獲取服務(wù)提供者地址,然后會(huì)將服務(wù)提供者地址緩存在本地,下次再調(diào)用時(shí),則直接從本地緩存中取,完成一次調(diào)用。
當(dāng)服務(wù)注冊(cè)中心Eureka Server檢測(cè)到服務(wù)提供者因?yàn)殄礄C(jī)、網(wǎng)絡(luò)原因不可用時(shí),則在服務(wù)注冊(cè)中心將服務(wù)置為DOWN狀態(tài),并把當(dāng)前服務(wù)提供者狀態(tài)向訂閱者發(fā)布,訂閱過(guò)的服務(wù)消費(fèi)者更新本地緩存。
服務(wù)提供者在啟動(dòng)后,周期性(默認(rèn)30秒)向Eureka Server發(fā)送心跳,以證明當(dāng)前服務(wù)是可用狀態(tài)。Eureka Server在一定的時(shí)間(默認(rèn)90秒)未收到客戶(hù)端的心跳,則認(rèn)為服務(wù)宕機(jī),注銷(xiāo)該實(shí)例。
eureka搭建

四個(gè)子項(xiàng)目作用如下:
①EurekaService:Eureka服務(wù)中心子項(xiàng)目,作用是作為Eureka服務(wù)程序,管理其他微服務(wù)的狀態(tài)。其他Eureka客戶(hù)端子項(xiàng)目運(yùn)行時(shí)需在此模塊進(jìn)行注冊(cè)。
②ServiceOne:Eureka客戶(hù)端-微服務(wù)1,提供了一個(gè)業(yè)務(wù)接口“serviceOne”。
③ServiceTwo:Eureka客戶(hù)端-微服務(wù)2,提供了一個(gè)業(yè)務(wù)接口“serviceTwo”。
④ServiceThree:Eureka客戶(hù)端-微服務(wù)3,提供了兩個(gè)業(yè)務(wù)接口:
“serviceThree_toOne”:內(nèi)部調(diào)用ServiceOne的“serviceOne接口”
“serviceThree_toTwo”:內(nèi)部調(diào)用ServiceTwo的“serviceTwo接口”
新建SpringCloud父項(xiàng)目
1.新建基于Maven的項(xiàng)目
作為SpringCloud其他子模塊的父項(xiàng)目,new->Project,選擇基于Maven的項(xiàng)目,填入GroupId和AtrifactId(項(xiàng)目名稱(chēng))然后創(chuàng)建。
2.父項(xiàng)目不需要寫(xiě)源碼,所以刪除項(xiàng)目的src文件夾。
3.配置父項(xiàng)目pom.xml中需增加的內(nèi)容:
<!--指定版本屬性,下面引用-->
<properties><java.version>1.8</java.version><spring-cloud.version>2021.0.3</spring-cloud.version><fastjson.version>1.2.47</fastjson.version>
</properties>
<!--引入SpringBoot父項(xiàng)目,不要通過(guò)dependencyManagement方式引入,否則打包會(huì)有問(wèn)題-->
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.8</version><relativePath/> <!--lookup parent from repository-->
</parent><!--dependencyManagement可以理解為多繼承父項(xiàng)目-->
<dependencyManagement><dependencies><!--引入SpringCloud父項(xiàng)目--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><!--阿里巴巴Fastjson--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>${fastjson.version}</version></dependency></dependencies>
</dependencyManagement><!--統(tǒng)一設(shè)置打包插件-->
<build><plugins><!--SpringBoot幫助maven打包項(xiàng)目的插件--><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins>
</build>
新建Eureka服務(wù)中心模塊
Eureka服務(wù)中心子項(xiàng)目,作用是作為Eureka服務(wù)程序,管理其他微服務(wù)的狀態(tài)。
1.在父項(xiàng)目中,新建子模塊項(xiàng)目:new->Module依然選擇maven項(xiàng)目。
Eureka服務(wù)中心項(xiàng)目名稱(chēng)我們命名為EurekaService。
配置文件
Eureka的pom.xml中新增對(duì)Eureka的依賴(lài)包和maven打包插件:
<dependencies><!--Eureka項(xiàng)目核心包--><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-web</artifactId></dependency>
</dependencies>
配置Eureka服務(wù)中心的application.yml配置文件
下面是文字版本的,便于拷貝
server:
port: 8001
eureka:
instance:
hostname: 127.0.0.1
client:
#由于該應(yīng)用為注冊(cè)中心,所以設(shè)置為false,代表不向注冊(cè)中心注冊(cè)自己
register-with-eureka: false
#由于注冊(cè)中心的職責(zé)是維護(hù)服務(wù)器示例,它不需要去檢索服務(wù),所以設(shè)置為false
fetch-registry: false
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka
spring:
application:
name: service-eureka

主類(lèi)main方法:


創(chuàng)建三個(gè)微服務(wù)子模塊并注冊(cè)為Eureka客戶(hù)端
創(chuàng)建三個(gè)Eureka客戶(hù)端子項(xiàng)目
我們創(chuàng)建3個(gè)Eureka客戶(hù)端子項(xiàng)目,命名為ServiceOne、ServiceTwo、ServiceThree。它們的配置都基本一致。
①ServiceOne:在Eureka中注冊(cè)為客戶(hù)端,提供一個(gè)業(yè)務(wù)接口:http://127.0.0.1:8001/serviceOne
②ServiceTwo:在Eureka中注冊(cè)為客戶(hù)端,提供一個(gè)業(yè)務(wù)接口:http://127.0.0.1:8002/serviceTwo
③ServiceThree:在Eureka中注冊(cè)為客戶(hù)端,提供兩個(gè)業(yè)務(wù)接口(內(nèi)部調(diào)用ServiceOne和ServiceTwo的接口):
http://127.0.0.1:8003/serviceThree_toOne
http://127.0.0.1:8003/serviceThree_toTwo
配置Eureka客戶(hù)端子項(xiàng)目的pom.xml
三個(gè)子項(xiàng)目pom.xml的依賴(lài)包完全一致:
<dependencies>
<!-- Eureka客戶(hù)端 -->
<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>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
</dependencies>
配置三個(gè)子項(xiàng)目的application.yml
三個(gè)子項(xiàng)目的application.yml配置文件基本一樣:
ServiceOne的application.yml

ServiceTwo的application.yml

ServiceThree的application.yml

三個(gè)子項(xiàng)目的主類(lèi)main方法
ServiceOne的主類(lèi)(與ServiceTwo基本一致)

ServiceTwo的主類(lèi)(與ServiceOne基本一致)

ServiceThree的主類(lèi),略有不同,需配置RestTemplate的Bean

三個(gè)子項(xiàng)目的Controller控制器
ServiceOne的控制器(與ServiceTwo基本一致)

ServiceTwo的控制器(與ServiceOne基本一致)

ServiceThree的控制器
與前兩個(gè)略有不同,需注入主類(lèi)配置的RestTemplate,通過(guò)它內(nèi)部調(diào)用微服務(wù)ServiceOne和ServiceTwo的業(yè)務(wù)接口
package com.tjetc.controller;import com.alibaba.fastjson.JSONObject;
import com.netflix.discovery.converters.Auto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;@RestControllerpublic class ServiceThreeController {@Autowiredprivate RestTemplate restTemplate;/*** http請(qǐng)求serviceOne的url并接收返回值* @return*/@RequestMapping("serviceThree_toOne")public JSONObject serviceThreeToOne() {//restTemplate發(fā)出get請(qǐng)求String result = restTemplate.getForObject("http:127.0.0.1:8001/serviceOne", String.class);JSONObject jsonObject = new JSONObject();jsonObject.put("code", "200");jsonObject.put("msg", "service three to one, return msg");jsonObject.put("data", result);return jsonObject;}@RequestMapping("serviceThree_toTwo")public JSONObject serviceThreeToTwo() {String result = restTemplate.getForObject("http:127.0.0.1:8002/serviceTwo", String.class);JSONObject jsonObject = new JSONObject();jsonObject.put("code", "200");jsonObject.put("msg", "service three to two, return msg");jsonObject.put("data", result);return jsonObject;}@RequestMapping("serviceThree")public JSONObject serviceThree() {JSONObject jsonObject = new JSONObject();jsonObject.put("code", "200");jsonObject.put("msg", "service three, return msg");return jsonObject;}
}
結(jié)果驗(yàn)證
1.按順序啟動(dòng)各個(gè)子項(xiàng)目
先啟動(dòng)EurekaService子項(xiàng)目,它是Eureka服務(wù)器,其他子模塊都需作為Eureka客戶(hù)端在它上面進(jìn)行注冊(cè)!
再啟動(dòng)ServiceOne、ServiceTwo和ServiceThree,啟動(dòng)后如下圖:

2.進(jìn)入Eureka服務(wù)狀態(tài)頁(yè)面,查看服務(wù)注冊(cè)情況
在谷歌瀏覽器中輸入:http://127.0.0.1:8000/,進(jìn)入Eureka服務(wù)頁(yè)面,我們主要查看當(dāng)前注冊(cè)情況:

如上圖所示,三個(gè)Eureka客戶(hù)端子項(xiàng)目都注冊(cè)成功。
3.驗(yàn)證ServiceOne的接口
在瀏覽器地址欄或者PostMan中請(qǐng)求ServiceOne的接口地址http://127.0.0.1:8001/serviceOne,驗(yàn)證請(qǐng)求結(jié)果:

5.驗(yàn)證ServiceThree包裝的接口
在瀏覽器地址欄或者PostMan中請(qǐng)求ServiceThree的兩個(gè)接口地址。
①http://127.0.0.1:8003/serviceThree_toOne,驗(yàn)證請(qǐng)求結(jié)果:

如上圖所示,其內(nèi)部成功的調(diào)用了ServiceOne提供的接口。
②http://127.0.0.1:8003/serviceThree_toTwo,驗(yàn)證請(qǐng)求結(jié)果:

如上圖所示,其內(nèi)部成功的調(diào)用了ServiceTwo提供的接口。
Ribbon-負(fù)載均衡
Ribbon簡(jiǎn)介
Spring Cloud Ribbon是基于Netflix Ribbon實(shí)現(xiàn)的一套客戶(hù)端 負(fù)載均衡的工具。
簡(jiǎn)單的說(shuō),Ribbon是Netflix發(fā)布的開(kāi)源項(xiàng)目,主要功能是提供客戶(hù)端的軟件負(fù)載均衡算法,將Netflix的中間層服務(wù)連接在一起。Ribbon客戶(hù)端組件提供一系列完善的配置項(xiàng)如連接超時(shí),重試等。簡(jiǎn)單的說(shuō),就是在配置文件中列出Load Balancer(簡(jiǎn)稱(chēng)LB)后面所有的機(jī)器,Ribbon會(huì)自動(dòng)的幫助你基于某種規(guī)則(如簡(jiǎn)單輪詢(xún),隨機(jī)連接等)去連接這些機(jī)器。我們也很容易使用Ribbon實(shí)現(xiàn)自定義的負(fù)載均衡算法。
LB,即負(fù)載均衡(Load Balance),在微服務(wù)或分布式集群中經(jīng)常用的一種應(yīng)用。
負(fù)載均衡簡(jiǎn)單的說(shuō)就是將用戶(hù)的請(qǐng)求平攤的分配到多個(gè)服務(wù)上,從而達(dá)到系統(tǒng)的HA。
常見(jiàn)的負(fù)載均衡有軟件Nginx,LVS,硬件 F5等。
相應(yīng)的在中間件,例如:dubbo和SpringCloud中均給我們提供了負(fù)載均衡,SpringCloud的負(fù)載均衡算法可以自定義。

Ribbon在工作時(shí)分成兩步:
第一步先選擇 EurekaServer ,它優(yōu)先選擇在同一個(gè)區(qū)域內(nèi)負(fù)載較少的server.
第二步再根據(jù)用戶(hù)指定的策略,在從server取到的服務(wù)注冊(cè)列表中選擇一個(gè)地址。
其中Ribbon提供了多種策略:比如輪詢(xún)、隨機(jī)和根據(jù)響應(yīng)時(shí)間加權(quán)。
Ribbon代碼編寫(xiě)
模仿ServiceOne子項(xiàng)目“復(fù)制”出ServiceOneCopy子項(xiàng)目
在上面eureka項(xiàng)目中,把service1的項(xiàng)目復(fù)制一下,取名ServiceOneCopy.ServiceOneCopy的作用是對(duì)ServiceOne提供的業(yè)務(wù)進(jìn)行分流,因此我們把ServiceOne中的所有內(nèi)容全部復(fù)制到新項(xiàng)目中一份,包括:pom.xml、application.yml、SpringBoot應(yīng)用主類(lèi)“ServiceOneApplication”和業(yè)務(wù)控制器“ServiceOneController”:然后再做接下來(lái)的修改。
修改application.yml
ServiceOne中也作了說(shuō)明:由于在ServiceThree中開(kāi)啟了ribbon負(fù)載均衡后,需要通過(guò)ServiceOne的“應(yīng)用名稱(chēng)”而不是IP+端口號(hào)訪(fǎng)問(wèn)業(yè)務(wù)接口,因此我們要把需要負(fù)載均衡的業(yè)務(wù)模塊,其應(yīng)用名稱(chēng)保持一致!
注意,改下端口,改成8004

修改SpringBoot應(yīng)用主類(lèi)名稱(chēng)
在idea中直接運(yùn)行項(xiàng)目時(shí),會(huì)按主類(lèi)的名稱(chēng)作為SpringBoot啟動(dòng)欄目的名稱(chēng),因此我們需要把主類(lèi)名稱(chēng)修改一下,我們修改為:“ServiceOneCopyApplication”。

修改業(yè)務(wù)接口的響應(yīng)結(jié)果
我們要分流ServiceOne的業(yè)務(wù)方法“serviceOne”,因此方法本身不能做改變(方法名、參數(shù)、返回結(jié)果格式),但為了驗(yàn)證分流的結(jié)果,我們?cè)诜祷氐捻憫?yīng)結(jié)果中增加了“copy”字樣文字:

http://127.0.0.1:8004/serviceOne

http://127.0.0.1:8000/

修改ServiceThree子項(xiàng)目
我們需要在ServiceThree中開(kāi)啟ribbon的負(fù)載均衡功能,由于ribbon依賴(lài)包已被Eureka引用,因此我們無(wú)需引入任何新依賴(lài)包,所以不需要修改pom.xml文件。
application.yml文件也不做任何修改。
下面對(duì)需要修改的兩處進(jìn)行說(shuō)明:
修改SpringBoot應(yīng)用主類(lèi),提供負(fù)載均衡能力
我們?cè)凇癝erviceThreeApplication”主類(lèi)中,給RestTemplate的Bean方法上添加@LoadBalanced注解,給RestTemplate對(duì)象開(kāi)啟ribbon負(fù)載均衡能力。
之后RestTemplate發(fā)送請(qǐng)求時(shí),就會(huì)自動(dòng)進(jìn)行請(qǐng)求的分流。

修改請(qǐng)求其他內(nèi)部業(yè)務(wù)接口的調(diào)用方式
由于需要對(duì)某一業(yè)務(wù)接口“負(fù)載均衡”,那么我們就不能再使用原先的IP+端口號(hào)的方式調(diào)用了,否則還是會(huì)把請(qǐng)求指定到一個(gè)部署的服務(wù)中。
ribbon的負(fù)載均衡是通過(guò)使用“應(yīng)用程序名”來(lái)代替IP+端口號(hào),來(lái)調(diào)用業(yè)務(wù)接口的。
因此我們需要在控制器中修改調(diào)用ServieOne的業(yè)務(wù)接口方式:
從:http://127.0.0.1:8001/serviceOne
修改為:http://service-one/serviceOne

結(jié)果驗(yàn)證
按順序啟動(dòng)各個(gè)子項(xiàng)目
先啟動(dòng)EurekaService子項(xiàng)目,它是Eureka服務(wù)器,其他子模塊都需作為Eureka客戶(hù)端在它上面進(jìn)行注冊(cè)!
再啟動(dòng)ServiceOne、ServiceOneCopy、ServiceTwo和ServiceThree,啟動(dòng)后如下圖:

進(jìn)入Eureka服務(wù)狀態(tài)頁(yè)面,查看服務(wù)注冊(cè)情況
在谷歌瀏覽器中輸入:http://127.0.0.1:8000/,進(jìn)入Eureka服務(wù)頁(yè)面,我們主要查看當(dāng)前注冊(cè)情況:

如上圖所示,名為“service-one”的微服務(wù),在Eureka中注冊(cè)數(shù)量為2,一個(gè)是ServiceOne啟動(dòng)的實(shí)例、另一個(gè)是ServiceOneCopy啟動(dòng)的實(shí)例。
驗(yàn)證ServiceThree的接口,驗(yàn)證負(fù)載均衡情況
在瀏覽器地址欄或者PostMan中重復(fù)請(qǐng)求ServiceThree的接口地址:
http://127.0.0.1:8003/serviceThree_toOne
第一次調(diào)用:

第二次調(diào)用:

如上圖所示,其內(nèi)部成功的調(diào)用了ServiceOne提供的接口,并負(fù)載均衡分流至了兩個(gè)模塊!
參考文章:
https://blog.csdn.net/weixin_45701868/article/details/125738876