SpringCloud-Eureka服務註冊與發現 SpringCloud專案建立
Eureka介紹
在微服務架構中往往會有一個註冊中心,每個微服務都會向註冊中心去註冊自己的地址及埠資訊,註冊中心維護著服務名稱與服務例項的對應關係。每個微服務都會定時從註冊中心獲取服務列表,同時彙報自己的執行情況,這樣當有的服務需要呼叫其他服務時,就可以從自己獲取到的服務列表中獲取例項地址進行呼叫。並且系統的維護人員也可以通過 Eureka Server 來監控系統中各個微服務是否正常執行。
Eureka就是服務註冊中心,也可以是一個叢集,對外暴露自己的地址;
服務提供者(ApplicationService):啟動後向Eureka註冊自己的資訊(地址,提供的服務)。
消費者(ApplicationClient):向Eureka訂閱服務,Eureka會把對應的服務的所有提供者的地址列表傳送給消費者,並且定期更新。
心跳(renew):提供者定期通過Http方式向Eureka重新整理自己的狀態。
Eureka和Zookeeper的區別
在一個分散式系統中,需要滿足CPA理論,包括一致性(Consistency)+ 分割槽容錯性(Partition tolerance)+ 可用性(Availability),但是,這三個要素不可能同時滿足C(一致性)、P(分割槽容錯性)和A(可用性),最多隻能同時實現兩點,不可能三者兼顧。
- 一致性(Consistency):由於分散式環境存在多個節點,這些節點上的資料在同一時間所儲存的資料必須是一致的,這就是一致性協議。
- 分割槽容錯性(Partition tolerance):可用性很好理解,任何時刻需要保證服務的可用和穩定。
- 可用性(Availability):所謂分割槽容錯是指某個時刻出現網路或者硬體不可用,甚至宕機,其它的機器還能保證正常可用。
說直白點,Eureka基於AP, 注重服務的可用性,即使所有機器都掛了,也能拿到本地快取的資料,保證高可用。Zookeeper基於CP, 注重資料的一致性,若主機掛掉則zk叢集整體不對外提供服務了,需要選一個新leader的出來(120s作用)才能繼續對外提供服務,不保證高可用。
搭建EurekaServer註冊中心
首先需要先建立一個SpringCloud專案,可參考SpringCloud專案建立,然後再建立一個Eureka的Module進行以下配置
Maven
<!--eureka-server--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
application.yml
Eureka更多配置項詳解可參考:https://blog.csdn.net/qq_45040919/article/details/120498288
server:
port: 7001
spring:
application:
name: Eureka-Server1
#Eureka配置
eureka:
instance:
hostname: localhost
client:
register-with-eureka: false #表示是否向Eureka註冊中心註冊自己
fetch-registry: false #如果為false,則表示自己為註冊中心
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
SpringBoot啟動類
@SpringBootApplication @EnableEurekaServer //啟動Eureka Server public class SpringcloudEureka7001Application { public static void main(String[] args) { SpringApplication.run(SpringcloudEureka7001Application.class, args); } }
啟動專案後訪問
服務提供者(也可以說是生產者)
服務提供者想要向Eureka註冊自己的資訊也很簡單,只需要三步
Maven
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
application.yml
加上Eureka的配置
#Eureka的配置
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka/ #Eureka叢集只需要用逗號分隔即可
instance:
instance-id: springclou-provider-user8081 #修改在Eureka上的預設描述資訊
SpringBoot啟動類
@SpringBootApplication @EnableEurekaClient public class SpringcloudProviederUser8081Application { public static void main(String[] args) { SpringApplication.run(SpringcloudProviederUser8081Application.class, args); } }
服務提供者啟動後再次去訪問Eureka
搭建Eureka註冊中心叢集
由於我們使用的是同一臺裝置,所以配置一下hosts檔案進行域名對映,hosts檔案所在路徑:C:\Windows\System32\drivers\etc
再建立一個Eureka
二者唯一的區別就是application.yml檔案
springcloud-eureka-7001
server:
port: 7001
spring:
application:
name: Eureka-Server1
#Eureka配置
eureka:
instance:
hostname: Eureka-Server1
client:
register-with-eureka: false #表示是否向Eureka註冊中心註冊自己
fetch-registry: false #如果為false,則表示自己為註冊中心
service-url:
#單機的話配置自己即可,叢集的話則不需要配置自己,全部配置其他Eureka節點,逗號分隔
defaultZone: http://Eureka-Server2:7002/eureka/
springcloud-eureka-7002
server:
port: 7002
spring:
application:
name: Eureka-Server2
#Eureka配置
eureka:
instance:
hostname: Eureka-Server2
client:
register-with-eureka: false #表示是否向Eureka註冊中心註冊自己
fetch-registry: false #如果為false,則表示自己為註冊中心
service-url:
#單機的話配置自己即可,叢集的話則不需要配置自己,全部配置其他Eureka節點,逗號分隔
defaultZone: http://Eureka-Server1:7001/eureka/
啟動Eureka集群后再次訪問eureka頁面,可以看到,他們其實是互相註冊的
服務提供者向Eureka叢集註冊自己
只需要修改applicaiton中的Eureka配置
#Eureka的配置
eureka:
client:
service-url:
defaultZone: http://Eureka-Server1:7001/eureka/,http://Eureka-Server2:7002/eureka/ #Eureka叢集只需要用逗號分隔即可
instance:
instance-id: springclou-provider-user8081 #修改在Eureka上的預設描述資訊
Eureka配置安全認證
#基於上方的Eureka叢集搭建進行配置
需要先給Eureka-Server新增如下依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
application.yml檔案配置security登入使用者密碼
spring:
application:
name: Eureka-Server1
security: #配置SpringSecurity登入使用者名稱和密碼
user:
name: macro
password: 123456
新增一個SpringSecurity的配置類
@EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().ignoringAntMatchers("/eureka/**"); super.configure(http); } }
applicaiton.yml中需要修改註冊中心地址格式為 http://${username}:${password}@${hostname}:${port}/eureka/
#Eureka配置
eureka:
instance:
hostname: Eureka-Server1
client:
register-with-eureka: false #表示是否向Eureka註冊中心註冊自己
fetch-registry: false #如果為false,則表示自己為註冊中心
service-url:
#單機的話配置自己即可,叢集的話則不需要配置自己,全部配置其他Eureka節點,逗號分隔
defaultZone: http://macro:123456@Eureka-Server2:7002/eureka/
此時再次訪問Eureka則顯示需要登入
服務提供者向做了安全認證的Eureka註冊自己
同樣的,applicaiton.yml中修改註冊中心地址格式為 http://${username}:${password}@${hostname}:${port}/eureka/即可
#Eureka的配置
eureka:
client:
service-url:
defaultZone: http://macro:123456@Eureka-Server1:7001/eureka/,http://macro:123456@Eureka-Server2:7002/eureka/ #Eureka叢集只需要用逗號分隔即可
instance:
instance-id: springclou-provider-user8081 #修改在Eureka上的預設描述資訊