註冊中心 - Eureka

📢 本文由 gemini-3-flash-preview 翻譯

引入註冊中心之前先引入提供者與消費者概念

提供者與消費者

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

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

提供者與消費者是相對的,一個服務既可以是提供者也可以是消費者

Eureka

若提供者有多個,消費者如何獲取提供者資訊,如何得知提供者的健康狀態

在啟動時,微服務向 Eureka 註冊服務資訊,消費者可透過 Eureka 抓取提供者資訊,然後進行遠端呼叫。微服務會每 30 秒向 Eureka 說明自己還活著,Eureka 會更新紀錄服務列表資訊,剔除不健康的伺服器

如果有多個服務提供者,消費者利用負載平衡演算法,從服務列表中挑選一個

建置

新建一個 Maven 模組,引入相依性

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

撰寫啟動類別

1
2
3
4
5
6
7
@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaApplication.class,args);
    }
}

設定檔

1
2
3
4
5
6
7
8
9
server:
  port: 7995
spring:
  application:
    name: eureka-server
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:7995/eureka

註冊服務

引入相依性

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

撰寫設定

1
2
3
4
5
6
7
spring:
  application:
    name: userService
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:7995/eureka

服務使用

承上例註冊

1
2
3
4
5
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
    return new RestTemplate();
}

修改呼叫的網域名稱為服務名稱

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
@Service
public class OrderService {

    @Autowired
    private OrderMapper orderMapper;
    @Autowired
    private RestTemplate restTemplate;

    public Order queryOrderById(Long orderId) {
        // 1. 查詢訂單
        Order order = orderMapper.findById(orderId);
        // 2. 查詢使用者
        // String url = "http://localhost:8081/user/" + order.getUserId();
        String url = "http://userService/user/" + order.getUserId();
        User user = restTemplate.getForObject(url, User.class);
        // 3. 封裝使用者資訊
        order.setUser(user);
        // 4. 回傳
        return order;
    }
}
This post is licensed under CC BY-NC-SA 4.0 by the author.
最後更新 2025-02-05 17:13 +0900