1. 程式人生 > 其它 >SpringCloud-Eureka服務註冊與發現 SpringCloud專案建立

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上的預設描述資訊