1. 程式人生 > 其它 >一 Eureka服務註冊與發現

一 Eureka服務註冊與發現

1.RestTemplate實現遠端呼叫

如果將一個系統進行拆分後,比如可以將一個電商系統可以拆分成訂單模組,使用者模組,商品模組,分別可以從資料庫中的訂單表,使用者表,商品表中查詢資料,那麼如果根據訂單id查詢訂單記錄時,訂單又需要根據userId查詢使用者資訊,我們就需要在查詢訂單的時候,一併查詢出使用者資訊,我們就需要使用RestTemplate進行跨服務查詢.步驟如下:

  • 註冊一個RestTemplate的例項到Spring容器
  • 根據RestTemplate物件進行遠端呼叫

1.1 註冊RestTemplate

在配置類中註冊RestTemplate例項

@Bean
public RestTemplate restTemplate() {
    return new RestTemplate();
}

1.2 實現遠端呼叫

通過restTemplate物件的getForObject方法實現遠端呼叫,傳入兩個引數,一個是需要遠端呼叫的url,二是返回的資料型別.

	private RestTemplate restTemplate;

    public Order queryOrderById(Long orderId) {
        // 1.查詢訂單
        Order order = orderMapper.findById(orderId);
        // 2.利用RestTemplate發起http請求,查詢使用者
        // 2.1.url路徑
        String url = "http://localhost:8081/user/" + order.getUserId();
        // 2.2.傳送http請求,實現遠端呼叫
        User user = restTemplate.getForObject(url, User.class);
        // 3.封裝user到Order
        order.setUser(user);
        // 4.返回
        return order;
    }

在此服務呼叫過程中,會有兩個不同的角色

服務提供者:一次業務中,被其它微服務呼叫的服務。(提供介面給其它微服務)

服務消費者:一次業務中,呼叫其它微服務的服務。(呼叫其它微服務提供的介面)

2.Eureka註冊中心

2.1 Eureka兩大元件

  • Eureka Server提供服務註冊
  • Eureka Client通過註冊中心進行訪問

2.2 搭建eureka-server

建立一個eureka-server的maven工程

2.2.1 引入eureka依賴

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

2.2.2 編寫啟動類

@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaApplication.class, args);
    }
}

2.2.3 編寫配置檔案

建立application.yml檔案

server:
  port: 10086
spring:
  application:
    name: eureka-server
eureka:
  client:
    service-url: 
      defaultZone: http://127.0.0.1:10086/eureka

接下來啟動微服務,然後在瀏覽器就可以訪問: http://127.0.0.1:10086

2.3 服務註冊

如果我們需要將user-service註冊到eureka-server中去,那麼我們只需要引入依賴和修改配置檔案

2.3.1 引入依賴

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

2.3.2 編寫配置檔案

建立application.yml檔案,新增服務名稱,eureka地址

server:
  port: 8081
spring:
  application:
    name: userservice
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka

為了模擬一個服務有多個例項的場景,我們可以再建立一個user-service2,修改其埠號為8082,其餘配置和user-service完全一樣.

2.4 服務發現

2.4.1 引入依賴

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

2.4.2 編寫配置檔案

server:
  port: 8080
spring:
  application:
    name: orderservice
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka

2.5 服務拉取與負載均衡

最後,我們要去eureka-server中拉取user-service服務的例項列表,並且實現負載均衡。

使用@LoadBalanced註解賦予RestTemplate負載均衡的能力

	@Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

修改服務呼叫的url地址

	@Autowired
    private RestTemplate restTemplate;

    public Order queryOrderById(Long orderId) {
        // 1.查詢訂單
        Order order = orderMapper.findById(orderId);
        // 2.利用RestTemplate發起http請求,查詢使用者
        // 2.1.url路徑
        String url = "http://userservice/user/" + order.getUserId();
        // 2.2.傳送http請求,實現遠端呼叫
        User user = restTemplate.getForObject(url, User.class);
        // 3.封裝user到Order
        order.setUser(user);
        // 4.返回
        return order;
    }

3.Eureka自我保護

Eureka-Client預設30秒會向Eureka-Server傳送一次心跳,證明它還活著,如果Eureka-Server在一定時間內(預設90秒)沒有收到Eureka-Client發來的心跳,那麼Eureka-Server將會把Eureka-Client服務剔除,但是如果Eureka-Server在短時間內丟失大量服務例項心跳,那Eureka-Server會開啟自我保護機制,不會立刻將Eureka-Client服務剔除,而讓其進入自我保護模式,待它再次傳送心跳,該節點便會回到正常.

一句話:某時刻某一個微服務不可用了,Eureka不會立刻清理,依舊會對該微服務的資訊進行儲存