阿里雲KubernetesSpringCloud實踐進行時(1):分散式服務註冊與發現

osswangxining發表於2018-05-25

簡介

為了更好地支撐日益增長的龐大業務量,我們常常需要把服務進行整合、拆分,使我們的服務不僅能通過叢集部署抵擋流量的衝擊,又能根據業務在其上進行靈活的擴充套件。隨著分散式的普及、服務的快速增長與雲端計算技術的進步,微服務架構也因其特有的優勢而備受關注。微服務架構的本質,是把整體的業務拆分成很多有特定明確功能的服務,通過很多分散的小服務之間的配合,去解決更大,更復雜的問題。對被拆分後的服務進行分類和管理,彼此之間使用統一的介面來進行互動。

本系列講述了在阿里雲Kubernetes容器服務基礎之上,如何快速搭建基於Spring Cloud的微服務架構中的基礎設施:

本文是系列中的第一篇,著重介紹分散式服務的註冊與發現。

在Spring Cloud裡,負責微服務註冊與發現的專案是Spring Cloud Netflix專案中的Eureka元件。Eureka分為兩大部分,Eureka Server與Eureka Client。相應地,Eureka Server負責管理、協調所有的微服務提供者,即Eureka Client。

下面講述一下在阿里雲Kubernetes容器服務基礎之上,如何快速搭建一套分散式服務註冊與發現系統。

準備Kubernetes環境

阿里雲容器服務Kubernetes 1.9.3目前已經上線,可以通過容器服務管理控制檯非常方便地快速建立 Kubernetes 叢集。具體過程可以參考 建立Kubernetes叢集

體驗通過應用目錄簡便部署

點選左側的應用目錄,在右側選中ack-springcloud-eureka,如下:

圖片.png

點選引數, 可以通過修改引數配置進行定製化。例如,可以通過執行2個例項,並進行互相註冊的方式來實現高可用的部署。

replicaCount: 2
image:
  repository: registry.cn-hangzhou.aliyuncs.com/aliacs-app-catalog/eureka
  tag: 1.5.13.RELEASE
  pullPolicy: Always
service:
  enabled: true
  type: LoadBalancer
  externalPort: 8761
  internalPort: 8761
management:
  endpointsEnabled: true

修改之後,在右側選擇對應的叢集、名稱空間,指定釋出名稱,然後點選部署。

幾分鐘之後,一個高可用的Eureka Server例項就可以建立出來。

體驗Eureka Server

點選左側的服務,在右側點選剛建立的Eureka Server服務提供的訪問地址,如下所示:

圖片.png

在開啟的Eureka Server介面中,可以看到如下類似的內容,則證明Eureka Server已正常啟動,並且通過執行2個例項,進行互相註冊的方式來實現高可用的部署。

圖片.png

開發微服務並註冊到Eureka Server

為了演示微服務如何註冊到Eureka Server, 我們提供了1個基於Spring Boot開發的微服務示例,具體程式碼請參閱: https://github.com/AliyunContainerService/spring-cloud-k8s-sample/tree/master/sample-service-eureka-client

import java.net.MalformedURLException;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
@EnableDiscoveryClient
@RestController
@EnableHystrix
public class SampleServiceApplication {

    @Autowired
    private DiscoveryClient discoveryClient;


    public static void main(String[] args) {
        SpringApplication.run(SampleServiceApplication.class, args);
        System.out.println("Running " + SampleServiceApplication.class + " via Spring Boot!");
    }

    @RequestMapping("/")
    public String home(@RequestParam(value = "service", required = false) String serviceName)
            throws MalformedURLException {
        List<ServiceInstance> list = discoveryClient.getInstances(serviceName);
        if (list != null && list.size() > 0) {
            String serviceURL = list.get(0).getUri().toURL().toString();
            serviceURL += "/hello?service=" + serviceURL;
            RestTemplate restTemplate = new RestTemplate();
            return restTemplate.getForObject(serviceURL, String.class);

        }
        return "Hello! This is from Sample Service 1!";
    }

    @RequestMapping("/hello")
    public String hello(@RequestParam(value = "service", required = false) String serviceName) {

        return "Hello! This is from " + serviceName + "!";
    }
}

注意,該Spring Boot的 application.yaml中需要確保如下配置:

eureka:
      instance:
        preferIpAddress: true

這樣註冊到Eureka Server上的是IP地址,而不是連不上的pod的hostname。

在開啟的Eureka Server介面中,可以看到如下類似的內容,則證客戶端也能正常註冊服務。

圖片.png

總結

我們可以利用阿里雲Kubernetes容器服務,快速搭建一套分散式服務註冊與發現系統,為應用引
入和配置Eureka服務。歡迎大家使用阿里雲上的容器服務,快速搭建一套分散式服務註冊與發現系統Eureka,比較簡單地整合到自己專案的微服務開發中。


相關文章