1. 程式人生 > >SpringCloud之Eureka註冊中心

SpringCloud之Eureka註冊中心

1.認識Eureka

Spring Cloud 為 開發者 提供了在 分散式系統 中的一些常用的元件(例如 配置 管理 ,服務發現,斷路器, 智慧 路由,微代理,控制匯流排,一次性令牌,全域性 鎖 定,決策競選, 分散式 會話 叢集 狀態)。使用Spring Cloud 開發 人員可以快速地完成實現這些模式的服務和應用程式。它們在任何分散式環境中都能很好地工作

2. Eureka 的 Server 與 Client

Eureka Server: 提供服務註冊與發現,Client 節點啟動後,會向 Eureka Server 傳送註冊事件,Eureka Server 登錄檔中將會儲存所有可用服務節點的資訊,服務節點的資訊可以在介面中直觀的看到。基於 Jersey 框架實現自身的 RESTful HTTP 介面,只要滿足規範任何語言程式都能向其進行註冊

Eureka Client: 任何形式的客戶端,只要滿足 Eureka Server 訂製的註冊標準。

3. 原理圖

在這裡插入圖片描述

  • Eureka:就是服務註冊中心(可以是一個叢集),對外暴露自己的地址
  • 提供者:啟動後向Eureka註冊自己資訊(地址,提供什麼服務)
  • 消費者:向Eureka訂閱服務,Eureka會將對應服務的所有提供者地址列表傳送給消費者,並且定期更新
  • 心跳(續約):提供者定期通過http方式向Eureka重新整理自己的狀態

4.Eureka入門案例

4.1編寫EurekaServer

接下來我們建立一個專案,啟動一個EurekaServer:

依然使用spring提供的快速搭建工具:
在這裡插入圖片描述
選擇依賴
在這裡插入圖片描述

pom檔案


	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
        <!-- SpringCloud版本,是最新的F系列 -->
		<spring-cloud.version>Finchley.RC1</spring-cloud.version>
	</properties>

	<dependencies>
        <!-- Eureka服務端 -->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
		</dependency>
	</dependencies>

	<dependencyManagement>
		<dependencies>
            <!-- SpringCloud依賴,一定要放到dependencyManagement中,起到管理版本的作用即可 -->
			<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>

編寫啟動類

@SpringBootApplication
@EnableEurekaServer // 宣告這個應用是一個EurekaServer
public class EurekaDemoApplication {

	public static void main(String[] args) {
		SpringApplication.run(EurekaDemoApplication.class, args);
	}
}

編寫配置application.yml:

server:
  port: 10086 # 埠
spring:
  application:
    name: eureka-server # 應用名稱,會在Eureka中顯示
eureka:
  client:
    register-with-eureka: false # 是否註冊自己的資訊到EurekaServer,預設是true
    fetch-registry: false # 是否拉取其它服務的資訊,預設是true
    service-url: # EurekaServer的地址,現在是自己的地址,如果是叢集,需要加上其它Server的地址。
      defaultZone: http://127.0.0.1:${server.port}/eureka

啟動服務,並訪問:http://127.0.0.1:10086/eureka
在這裡插入圖片描述
在這裡插入圖片描述

4.2將服務註冊到Eureka

註冊服務,就是在服務上新增Eureka的客戶端依賴,客戶端程式碼會自動把服務註冊到EurekaServer中。

先新增SpringCloud依賴:

<!-- SpringCloud的依賴 -->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Finchley.RC1</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
<!-- Spring的倉庫地址 -->
<repositories>
    <repository>
        <id>spring-milestones</id>
        <name>Spring Milestones</name>
        <url>https://repo.spring.io/milestone</url>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
</repositories>

然後是Eureka客戶端:

<!-- Eureka客戶端 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

通過新增@EnableEurekaClient來開啟Eureka客戶端功能

@SpringBootApplication
@EnableEurekaClient // 開啟EurekaClient功能
public class UserServiceDemoApplication {
	public static void main(String[] args) {
		SpringApplication.run(UserServiceDemoApplication.class, args);
	}
}

編寫配置:

server:
  port: 8081
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb1?useUnicode=true&characterEncoding=utf8
    username: root
    password: 123456
    driver-class-name: com.mysql.jdbc.Driver
  application:
    name: user-service # 應用名稱
eureka:
  client:
    service-url: # EurekaServer地址
      defaultZone: http://127.0.0.1:10086/eureka
  instance:
    prefer-ip-address: true # 當呼叫getHostname獲取例項的hostname時,返回ip而不是host名稱
    ip-address: 127.0.0.1 # 指定自己的ip資訊,不指定的話會自己尋找

注意:

  • 這裡我們添加了spring.application.name屬性來指定應用名稱,將來會作為應用的id使用。
  • 不用指定register-with-eureka和fetch-registry,因為預設是true

重啟專案,報錯
在這裡插入圖片描述

解決方案,設定如下:
在這裡插入圖片描述

再次執行,ok
在這裡插入圖片描述
我們發現user-service服務已經註冊成功了

4.3 消費者從Eureka獲取服務

方法與消費者類似,只需要在專案中新增EurekaClient依賴,就可以通過服務名稱來獲取資訊了!

先新增依賴

<!-- SpringCloud的依賴 -->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Finchley.RC1</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
<!-- Spring的倉庫地址 -->
<repositories>
    <repository>
        <id>spring-milestones</id>
        <name>Spring Milestones</name>
        <url>https://repo.spring.io/milestone</url>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
</repositories>

然後是Eureka客戶端:

<!-- Eureka客戶端 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

在啟動類開啟Eureka客戶端

@SpringBootApplication
@EnableDiscoveryClient // 開啟Eureka客戶端
public class UserConsumerDemoApplication {
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
    public static void main(String[] args) {
        SpringApplication.run(UserConsumerDemoApplication.class, args);
    }
}

修改配置

server:
  port: 8080
spring:
  application:
    name: user-consumer # 應用名稱
eureka:
  client:
    service-url: # EurekaServer地址
      defaultZone: http://127.0.0.1:10086/eureka
  instance:
    prefer-ip-address: true # 當其它服務獲取地址時提供ip而不是hostname
    ip-address: 127.0.0.1 # 指定自己的ip資訊,不指定的話會自己尋找

修改user-consumer-demo專案中的UserDao程式碼,用DiscoveryClient類的方法,根據服務名稱,獲取服務例項:
在這裡插入圖片描述

 // 必須匯入org.springframework.cloud.client.discovery.DiscoveryClient
    @Autowired
    private DiscoveryClient discoveryClient;


    public User queryUserById(Long id){
        //1、 根據user-service獲取user-serivce 的叢集的資訊
        List<ServiceInstance> instances = discoveryClient.getInstances("user-service");
        //2、由於我們沒有叢集,只有一個,所以直接取出第一個
        ServiceInstance instance = instances.get(0);
        //3、拼接URL
        String url = "http://"+instance.getHost()+":"+instance.getPort()+"/user/"+id;

        // 使用restTemplate發起請求
        ResponseEntity<User> entity = restTemplate.getForEntity(url, User.class);
        // 獲取返回物件
        User user = entity.getBody();
        return user;
    }

Debug跟蹤執行:
在這裡插入圖片描述

生成的URL:
在這裡插入圖片描述
訪問結果:
在這裡插入圖片描述
這樣就完成Eureka入門案例啦 !