spring cloud 構(gòu)建微服務二(eureka)服務注冊中心的高可用性、服務調(diào)用、負載均衡

前一篇文章寫了如何使用eureka來進行服務的注冊與發(fā)現(xiàn)。這篇記錄下,如何使用 eureka進行服務注冊中心的高可用性、服務調(diào)用、負載均衡。

  • 先看一下配置表。
應用名稱 eureka-server eureka-service eureka-customer
端口 9000-9099 9100-9199 9200-9299
說明 提供注冊服務 服務本身 消費服務
初始化3個eureka-server項目
  • 如何初始化項目,使用的注解等這里就不寫了,在第一篇里有。其三個項目的配置文件分別為:
# 服務注冊中心
spring.application.name=eureka-server
server.port=9000

#####################################
### eureka 實例配置###################
#####################################
eureka.instance.hostname=eureka-server0
# eureka 客戶端(發(fā)布的業(yè)務服務)向 eureka 服務中心發(fā)送心跳,表示該客戶端依然存在,
# 如果在 leaseExpirationDurationInSeconds 時間內(nèi)沒有收到心跳,則服務中心會把實例從視圖移除
eureka.instance.lease-renewal-interval-in-seconds=4
# 發(fā)送心跳時,等待接收心跳的最大時間。該值應該大于 leaseRenewalIntervalInSeconds
# 如果該值太大,則很可能將流量轉(zhuǎn)發(fā)過去的時候,該實例已不可用
# 如果該值太小,則實例很可能因為臨時的網(wǎng)絡抖動而被移除
eureka.instance.lease-expiration-duration-in-seconds=6

#####################################
### eureka 客戶端配置(發(fā)布的業(yè)務服務)##
#####################################
# 間隔多久后,從 eureka 服務中心上更新注冊自己的業(yè)務服務
eureka.client.registry-fetch-interval-seconds=5
# eureka 服務中心的地址
eureka.client.serviceUrl.defaultZone=http://eureka-server1:9001/eureka/,http://eureka-server2:9002/eureka/

#####################################
### eureka 服務端配置#################
#####################################
# 清理間隔(單位毫秒,默認是0 不清除)
eureka.server.eviction-interval-timer-in-ms=3000
# 服務注冊中心
spring.application.name=eureka-server
server.port=9001

#####################################
### eureka 實例配置###################
#####################################
eureka.instance.hostname=eureka-server1
# eureka 客戶端(發(fā)布的業(yè)務服務)向 eureka 服務中心發(fā)送心跳,表示該客戶端依然存在,
# 如果在 leaseExpirationDurationInSeconds 時間內(nèi)沒有收到心跳,則服務中心會把實例從視圖移除
eureka.instance.lease-renewal-interval-in-seconds=4
# 發(fā)送心跳時,等待接收心跳的最大時間。該值應該大于 leaseRenewalIntervalInSeconds
# 如果該值太大,則很可能將流量轉(zhuǎn)發(fā)過去的時候,該實例已不可用
# 如果該值太小,則實例很可能因為臨時的網(wǎng)絡抖動而被移除
eureka.instance.lease-expiration-duration-in-seconds=6

#####################################
### eureka 客戶端配置(發(fā)布的業(yè)務服務)##
#####################################
# 間隔多久后,從 eureka 服務中心上更新注冊自己的業(yè)務服務
eureka.client.registry-fetch-interval-seconds=5
# eureka 服務中心的地址
eureka.client.serviceUrl.defaultZone=http://eureka-server0:9000/eureka/,http://eureka-server2:9002/eureka/

#####################################
### eureka 服務端配置#################
#####################################
# 清理間隔(單位毫秒,默認是0 不清除)
eureka.server.eviction-interval-timer-in-ms=3000
# 服務注冊中心
spring.application.name=eureka-server
server.port=9002

#####################################
### eureka 實例配置###################
#####################################
eureka.instance.hostname=eureka-server2
# eureka 客戶端(發(fā)布的業(yè)務服務)向 eureka 服務中心發(fā)送心跳,表示該客戶端依然存在,
# 如果在 leaseExpirationDurationInSeconds 時間內(nèi)沒有收到心跳,則服務中心會把實例從視圖移除
eureka.instance.lease-renewal-interval-in-seconds=4
# 發(fā)送心跳時,等待接收心跳的最大時間。該值應該大于 leaseRenewalIntervalInSeconds
# 如果該值太大,則很可能將流量轉(zhuǎn)發(fā)過去的時候,該實例已不可用
# 如果該值太小,則實例很可能因為臨時的網(wǎng)絡抖動而被移除
eureka.instance.lease-expiration-duration-in-seconds=6

#####################################
### eureka 客戶端配置(發(fā)布的業(yè)務服務)##
#####################################
# 間隔多久后,從 eureka 服務中心上更新注冊自己的業(yè)務服務
eureka.client.registry-fetch-interval-seconds=5
# eureka 服務中心的地址
eureka.client.serviceUrl.defaultZone=http://eureka-server0:9000/eureka/,http://eureka-server1:9001/eureka/

#####################################
### eureka 服務端配置#################
#####################################
# 清理間隔(單位毫秒,默認是0 不清除)
eureka.server.eviction-interval-timer-in-ms=3000
  • 之后分別啟動這三個eureka-server注冊服務中心項目。
    啟動后會看到有三個可用的服務注冊中心
初始化2個eureka-service項目
  • 如何初始化項目、使用的注解等這里就不寫了,在第一篇里有。2個項目的配置文件分別為:
# 服務提供者
spring.application.name=eureka-service
server.port=9100

# eureka 服務中心的地址
eureka.client.serviceUrl.defaultZone=http://eureka-server0:9000/eureka/,http://eureka-server1:9001/eureka/,http://eureka-server2:9002/eureka/
# 服務提供者
spring.application.name=eureka-service
server.port=9101

# eureka 服務中心的地址
eureka.client.serviceUrl.defaultZone=http://eureka-server0:9000/eureka/,http://eureka-server1:9001/eureka/,http://eureka-server2:9002/eureka/
  • 啟動這兩個項目


    啟動后服務注冊中心已經(jīng)發(fā)現(xiàn)了這兩個業(yè)務服務
創(chuàng)建服務消費者
  • 項目配置文件為:
# 服務消費者
spring.application.name=eureka-customer
server.port=9200

# eureka 服務中心的地址
eureka.client.serviceUrl.defaultZone=http://eureka-server0:9000/eureka/,http://eureka-server1:9001/eureka/,http://eureka-server2:9002/eureka/
  • EurekaCustomerApplication.java
package com.zb.eurekacustomer;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@EnableDiscoveryClient
@SpringBootApplication
public class EurekaCustomerApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaCustomerApplication.class, args);
    }
}
  • RestConfig.java 使用RestTemplate發(fā)起真實的rest請求
package com.zb.eurekacustomer.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

/**
 * @author 張博
 */
@Configuration
public class RestConfig {

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}
  • UserCustomerController.java LoadBalancerClientspring cloud提供的一個客戶端負責均衡器。作用是時流量均衡流向每一個服務。
package com.zb.eurekacustomer.c_user.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

/**
 * @author 張博
 */
@RestController
public class UserCustomerController {

    private LoadBalancerClient loadBalancerClient;
    private RestTemplate restTemplate;

    @Autowired
    private UserCustomerController(LoadBalancerClient loadBalancerClient, RestTemplate restTemplate) {
        this.loadBalancerClient = loadBalancerClient;
        this.restTemplate = restTemplate;
    }

    @RequestMapping(value = "/getServices", method = RequestMethod.GET)
    public String getServices() {
        // 從 LoadBalancer 中為指定的業(yè)務服務選擇業(yè)務服務實例
        ServiceInstance serviceInstance = loadBalancerClient.choose("eureka-service");
        String url = "http://" + serviceInstance.getHost() + ":" + serviceInstance.getPort() + "/getServices/" + serviceInstance.getPort();
        System.out.println(url);
        return restTemplate.getForObject(url, String.class);
    }
}

  • 啟動項目


    啟動后可以發(fā)現(xiàn)服務消費者出現(xiàn)在了服務注冊中心
演示
  • 服務調(diào)用
    在瀏覽器中輸入 http://127.0.0.1:9200/getServices

    發(fā)現(xiàn)可用調(diào)用遠程的服務

  • 負載均衡
    在瀏覽器中多次刷新http://127.0.0.1:9200/getServices

    可以發(fā)現(xiàn)負載均衡可以正常使用,流量被均攤

  • 注冊中心的高可用性
    我們停掉端口為9001注冊中心

    發(fā)現(xiàn)端口為9001不在了

不可用的服務
  • 這時我們發(fā)布新的業(yè)務服務。發(fā)現(xiàn)還是可以正常使用。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容