一性置、簡介
? ? ? ? 1.概念:
????????????????在微服務架構下定铜,一個服務自動定位 到被調用的服務的過程稱為服務發(fā)現(xiàn)。
? ? ? ? 2.目的:
? ??????????????我們約定提供服務的一方霉翔,即RPC的服務端,稱為服務提供者
????????????????調用或說使用服務的一方苞笨,即RPC的客戶端债朵,稱為服務消費者
????????????????1. 服務消費者上線時,能夠發(fā)現(xiàn)合適的服務提供者
????????????????2. 當某個服務提供者上線時瀑凝,消費者能夠獲悉服務的存在
????????????????3. 服務提供者實例發(fā)生變動不可用時(如故障 或者重新發(fā)布而不可用)葱弟,消費者得到通知,停止對其調用
????????????????4. 新增服務實例可以被消費者使用猜丹,跟第一條不同的是芝加,這里是擴展操作,即為一個已有服務增加實例(如3臺服務器變成4臺服務器)
? ? ? ? 3.環(huán)節(jié):
? ? ? ? ? ? ? ? 1.服務注冊射窒,提供者將服務公之于眾藏杖,讓服務消費者可以知曉服務的狀態(tài)
? ? ? ? ? ? ? ? 2.服務下線,提供者聲明服務不再可用脉顿,后續(xù)不再調用該服務
? ? ? ? ? ? ? ? 3.服務查詢蝌麸,消費者可以查詢到所需調用的服務的地址、端口等等信息艾疟,以用于調用
? ? ? ? ? ? ? ? 4.服務健康檢查来吩,需要知曉服務提供者當前是否可用,如果不可用則不再對外提供服務
? ? ? ? ? ? ? ? 5.服務通知蔽莱,當服務狀態(tài)發(fā)生變化時確保消費者知曉弟疆,則需要通知消費者
? ? ? ? 4.過程:
????????????????有服務注冊表組件作為中間人,然后服務提供者啟動時會將服務注冊到服務注冊表中盗冷,當服務調用者需要調用服務時則從服務注冊表中查找相應的服務并調用怠苔。這就是服務發(fā)現(xiàn)的過程。具體步驟如下:
? ??????????????①服務提供者啟動時仪糖,將服務注冊到服務注冊表
????????????????②服務消費者啟動時拉取服務列表
????????????????③服務消費者需要調用時從服務注冊表中選擇合適的服務并調用
????????????????④服務注冊表檢測服務提供者的健康狀況并更新服務列表
????????????????⑤當服務健康狀態(tài)發(fā)生改變時通知客戶端更新服務列表
二柑司、Eureka
? ? ? ? 1.Eureka簡介:
? ? ? ? ? ? ? ? 1.Eureka是NetFlix開源的一款服務發(fā)現(xiàn)組件。Spring Cloud對其進行了封裝锅劝。
? ? ? ? ? ? ? ? 2.Eureka基于 REST(Representational State Transfer) 協(xié)議通信
? ? ? ? ? ? ? ? 3.Eureka不存儲任何信息攒驰,而是使用客戶端心跳推送的方式來做健康檢測,也就是Eureka Client會在指定間隔時間內發(fā)送一段信息給服務端故爵,服務端據(jù)此確認服務的健康性
? ? ? ? 2.主要組件:
? ? ? ? ? ? ? ? 1.Eureka-Server玻粪,獨立部署的系統(tǒng),負責管理服務信息(接收服務注冊、檢測服務是否存活)奶段,支持配置成集群饥瓷,保證高可用
? ? ? ? ? ? ? ? 2.Eureka-Client,集成在服務中(服務提供與消費者都有集成)痹籍,與Eureka-Server通信呢铆,執(zhí)行服務注冊、獲取服務列表等
三蹲缠、Eureka-Server搭建
? ? ? ? 1.步驟:
? ?????????????①IDEA中執(zhí)行以下操作:File>New Project>Spring Initalizr進入如下界面棺克,點擊 Next
? ? ? ????????? ②填寫Maven坐標GAV、項目描述等线定,Next
? ? ? ? ? ? ? ? ③選擇相應的依賴娜谊,這里很簡單,選擇Eureka-Server即可斤讥,Next
? ? ? ? ? ? ? ? ④選擇相應的依賴纱皆,這里很簡單,選擇Eureka-Server即可芭商,Next
? ? ? ? ? ? ? ? ⑤選擇項目存放位置后派草,完成項目,在當前窗口打開項目铛楣,此時Maven會下 載項目依賴近迁,稍等片刻后項目即創(chuàng)建完成。
? ? ? ? 2. 搭建項目:
? ??????????????生成的項目簸州,是標準的Spring Cloud項目鉴竭,與其他Spring Boot項目pom.xml文件有不同的地方:
①:依賴管理部分導入了SpringCloud的依賴管理BOM,可以直接引用Spring-Cloud各個 組件而不需要添加版本號
<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>
②:引用了Spring-Cloud的組件岸浑, 這里引入了Eureka-Server
<dependency>
????<groupId>org.springframework.cloud</groupId>
????<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
?</dependency>
????????3.添加注解:
? ??????????????項目雖然引入了Eureka-Server的包搏存,但還未啟用該功能蜒犯,我們通過給Application添加注解來啟動Eureka-Server功能逻淌。
@SpringBootApplication
@EnableEurekaServer//啟動EurekaServer功能
public class EurekaserverApplication {
????public static void main(String[] args) {
????????SpringApplication.run(EurekaserverApplication.class, args);
????}
}
? ? ? ? 4.添加配置:
? ??????????????給Eureka-Server添加一些必要的配置。Spring-Boot的外化配置特性羔味,配置文件統(tǒng)一放在resources/application.properties中兵钮。配置如下:
#項目信息
spring.application.name=eurekaserver
server.port=9600
#單機模式配置
#服務器名
eureka.instance.hostname=localhost
#是否注冊到Eureka-Server,Eureka-Server本身也可以是Client,所以有此選項,這里默認關閉
eureka.client.register--with-eureka=false
#是否拉取服務列表,同上因為是Server所以不需要拉取列表
eureka.client.fetch-registry=false
#client的服務地址,server的地址是自己
eureka.client.service-url.defaultZone=
http://${eureka.instance.hostname}:${server.port}/eureka/
????????5.啟動并查看項目:
? ??????????????運行Application舌界,服務啟動日志沒有報錯即表示啟動成功掘譬。 此時訪問 localhost:9600可以看見Eureka-Server的Web界面
四、Eureka Client搭建
? ? ? ? 1.簡介:Eureka-Client其實是包含在項目中的呻拌,分成服務提供者和服務消費者兩個角色葱轩。我們假設這里有個電影評分服務,顯然電影網(wǎng)站(movie)就是服務消費者,評分服務(rating)就是服務提供者了靴拱。需要分別創(chuàng)建movie項目和rating項目都要包含eureka-client垃喊,并通過配置指向同一個eureka-server。
? ? ? ? 2.搭建rating服務(服務提供方):
? ? ? ? ? ? ? ? ①創(chuàng)建項目:參考Eureka-Server搭建
? ? ? ? ? ? ? ? ②添加配置 :
? ??????????????????????#應用信息
? ??????????????????????spring.application.name=rating
? ??????????????????????server.port=9501
? ??????????????????????#Eureka配置,主要是Eureka-server的地址
? ??????????????????????eureka.client.service-url.defaultZone=http://localhost:9600/eureka
? ? ? ? ? ? ? ? ③添加評分功能 :
? ??????????????????????@RestController
????????????????????????public class RatingController {
????????????????????????????@RequestMapping("rate")
????????????????????????????public int rate(String movieName){
????????????????????????????????????return movieName.length();
????????????????????????????}
????????????????????????}
? ? ? ? ? ? ? ? ④啟動&訪問驗證 :和Eureka-Server搭建的第3步添加注解一樣
? ? ? ? 3.搭建movie項目(服務消費方):
? ??????????????①創(chuàng)建項目:參考Eureka-Server搭建
????????????????②添加配置:
? ??????????????????????#應用信息
????????????????????????spring.application.name=movie
? ? ? ? ? ? ? ? ? ? ? ? server.port=9502
????????????????????????#Eureka配置,主要是Eureka-server的地址
????????????????????????eureka.client.service-url.defaultZone=http://localhost:9600/eureka
????????????????③添加調用評分服務的代碼
(1)先配置一個 RestTemplate用于調用遠程服務:
@Configuration
public class AppConfig {
????@Bean
????public RestTemplate restTemplate(){
????????return new RestTemplate();
????}
}
(2)評分服務的代碼:
@RestController
public class MovieController {
????@Autowired
????private RestTemplate restTemplate;
????@Autowired
????private EurekaClient discoveryClient;
????@RequestMapping("movie")
????public String showMovie(String movieName, ModelMap modelMap){
????????InstanceInfo instance = discoveryClient.getNextServerFromEureka("rating",false);
????????String serviceUrl= instance.getHomePageUrl();
????????System.out.println(serviceUrl);
????????int credit = restTemplate.getForObject(serviceUrl+"/rate?movieName="+movieName,Integer.class);
????????return "電影【"+movieName+"】的評分為"+credit;
? ? }
}
????????????????④啟動&訪問驗證:和Eureka-Server搭建的第3步添加注解一樣