爲了解決硬編碼的遺留問題,須要服務註冊與發現機制來解決這些問題。
java
服務註冊與發現機制的做用:記錄每一個服務提供者的網絡信息,向服務消費者提供所需服務網絡信息。
spring
1、服務發現組件緩存
服務提供者、服務消費者、服務發現組件三者之間的關係:網絡
一、每個爲服務啓動的時候都會將本身的網絡信息註冊到服務發現組件中,服務發現組件將這些信息進行存儲;app
二、服務消費者從服務發現組件中查詢服務提供者的網絡信息,並使用這些信息對服務提供者進行訪問;ide
三、每一個微服務與服務發現組件之間經過存在通訊機制,當服務發現組件長時間沒法與某微服務進行聯繫,服務發現組件會將該實例註銷;微服務
四、微服務的網絡信息進行變動時,會從新註冊到服務發現組建中,該服務的調用方無需修改提供者的信息。fetch
服務發現組件基本功能:編碼
一、服務註冊表:這是服務發現組件的核心。用來記錄各個微服務的信息,包括微服務的名稱、IP、端口等。服務註冊表提供查詢API和管理API,查詢API用於查詢可用的微服務實例,管理API用於服務的註冊與註銷;url
二、服務註冊與發現:
服務註冊:微服務啓動時將信息註冊到服務發現組件中的過程;
服務發現:查詢可用的微服務列表及其網絡信息的機制
三、服務檢查:使用必定的機制檢測服務的有效性,若是檢測到某微服務已經掛掉會自動將該實例註銷。
2、Eureka
Eureka是springcloud提供的一種服務發現組件。
一、Eureka Server 和 Eureka client
Eureka包含兩個組件:Eureka Server 和 Eureka client,兩者關係以下:
Eureka Server提供了服務發現與註冊的機制,微服務啓動時會向Eureka Server註冊本身的信息,Eureka Server會將這些信息進行存儲。
微服務啓動後,會在指定間隔(默認30秒)向Eureka Server發送心跳,代表服務正在運行;
若是Eureka Server長時間(默認90秒)沒有收到來自某微服務的心跳,Eureka Server就會註銷這個實例;
Eureka client緩存了服務註冊表的信息。微服務無需每次都向Eureka Server查詢服務狀態,減輕了Eureka Server的壓力。同時,若是Eureka Server掛掉,微服務依然能夠從緩存中獲取到服務提供者的網絡信息並完成調用。
3、編寫Eureka Server
項目結構以下:
添加pom依賴:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> </dependency>
啓動類添加註解:
@SpringBootApplication @EnableEurekaServer //代表本身是一個Eureka Server public class EurakaApplication { public static void main(String[] args) { SpringApplication.run(EurakaApplication.class, args); } }
yml文件中添加配置:
server: port: 8761 eureka: client: register-with-eureka: false #表示是否將本身註冊到Eureka Server中,默認爲true。因爲本項目就是一個Eureka Server,故此處設爲false fetch-registry: false #表示是否從其餘Eureka Server中獲取信息,因爲此處爲單點Eureka Server,設爲false便可 service-url: default-zone: # 設置與Eureka Server的交互地址,查詢與註冊服務都須要用到該地址,多個地址可使用","分隔
此時啓動項目而且訪問http://localhost:8716/,獲得以下頁面,此時尚未任何微服務註冊進來。
4、將微服務註冊到Eureka Server中
還以user項目爲例:
pom依賴:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> </dependency>
yml文件:
spring: application: name: user # 指定註冊到Eureka Server中的應用名字 eureka: client: service-url: default-zone: http://localhost:8761/eureka/ instance: prefer-ip-address: true #是否將本身的IP註冊到Eureka Server中,若是不配置或設置爲false,會將微服務所在的操做系統的hostname註冊到Eureka Server
啓動類添加註解:
@SpringBootApplication @EnableEurekaClient //聲明本身是一個註冊服務 public class UserApplication { public static void main(String[] args) { SpringApplication.run(UserApplication.class, args); } }
此時啓動項目而且再次訪問:http://localhost:8716/,獲得以下頁面:
此時用戶微服務已經註冊到Eureka Server中。