1. 程式人生 > >SpringCloud--03、Eureka註冊中心

SpringCloud--03、Eureka註冊中心

1、概述

ureka就好比是滴滴,負責管理、記錄服務提供者的資訊。服務呼叫者無需自己尋找服務,
而是把自己的需求告訴Eureka,然後Eureka會把符合你需求的服務告訴你。
同時,服務提供方與Eureka之間通過“心跳”機制進行監控,當某個服務提供方出現問題,Eureka自然會把它從服務列表中剔除。

最終實現:服務的自動註冊、發現、狀態監控

2、原理圖

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

 

3、入門案例

建立工程、

匯入依賴、pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>cloud-demo</artifactId>
        <groupId>com.baidus.demo</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.baidus.demo</groupId>
    <artifactId>eureka-server</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
    </dependencies>

</project>

 

啟動類、EurekaDemoApp.java

package com.baidus.eureka.domain;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

/**
 * @ Author     :ShaoWei Sun.
 * @ Date       :Created in 17:42 2018/12/1
 */
@SpringBootApplication
@EnableEurekaServer
public class EurekaDemoApp {
    public static void main(String[] args) {
        SpringApplication.run(EurekaDemoApp.class,args);
    }
}

全域性配置 applicaton.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

 

4、將user-service註冊到Eureka

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

在user-service中新增依賴

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

在user-service啟動類新增@EnableDiscoveryClient 、開啟Eureka客戶端功能

package com.baidus.user;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import tk.mybatis.spring.annotation.MapperScan;

/**
 * @ Author     :ShaoWei Sun.
 * @ Date       :Created in 16:08 2018/12/1
 */
@SpringBootApplication
@MapperScan("com.baidus.user.mapper")
@EnableDiscoveryClient //開啟EurekaClient功能
public class UserApp {
    public static void main(String[] args) {
        SpringApplication.run(UserApp.class,args);
    }
}

application.yml配置檔案

server:
  port: 8081

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mybatis
    username: root
    password: sswqzx
  application:
    name: user-service # 應用名稱

mybatis:
  type-aliases-package: com.baidus.user.pojo

eureka:
  client:
    service-url:  # EurekaServer地址
      defaultZone: http://127.0.0.1:10087/eureka
  instance:
    prefer-ip-address: true # 當呼叫getHostname獲取例項的hostname時,返回ip而不是host名稱
    ip-address: 127.0.0.1 # 指定自己的ip資訊,不指定的話會自己尋找
    lease-expiration-duration-in-seconds: 10 #服務續約(renew)的間隔,預設為30秒
    lease-renewal-interval-in-seconds: 5 #服務失效時間,預設值90秒

重啟:訪問:http://localhost:10087/

5、消費者從Eureka獲取服務

修改consumer-demo

新增依賴

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

啟動類

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

配置檔案application.yml

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

service.java程式碼

@Service
public class UserService {

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private DiscoveryClient discoveryClient;// Eureka客戶端,可以獲取到服務例項資訊
//如果用了robbin負載就有了負載均衡演算法、輪詢和隨機

    public List<User> queryUserByIds(List<Long> ids) {
        List<User> users = new ArrayList<>();
        // String baseUrl = "http://localhost:8081/user/";
        // 根據服務名稱,獲取服務例項
        List<ServiceInstance> instances = discoveryClient.getInstances("user-service");
        // 因為只有一個UserService,因此我們直接get(0)獲取
        ServiceInstance instance = instances.get(0);
        // 獲取ip和埠資訊
        String baseUrl = "http://"+instance.getHost() + ":" + instance.getPort()+"/user/";
        ids.forEach(id -> {
            // 我們測試多次查詢,
            users.add(this.restTemplate.getForObject(baseUrl + id, User.class));
            // 每次間隔500毫秒
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        return users;
    }
}

重啟訪問:http://localhost/8081/consume?ids=1,2,3