spring cloud構建網際網路分散式微服務雲平臺-服務註冊與發現

IT小兵發表於2019-02-21

Spring Cloud Eureka是Spring Cloud Netflix專案下的服務治理模組。而Spring Cloud Netflix專案是Spring Cloud的子專案之一,主要內容是對Netflix公司一系列開源產品的包裝,它為Spring Boot應用提供了自配置的Netflix OSS整合。通過一些簡單的註解,開發者就可以快速的在應用中配置一下常用模組並構建龐大的分散式系統。它主要提供的模組包括:服務發現(Eureka),斷路器(Hystrix),智慧路由(Zuul),客戶端負載均衡(Ribbon)等。願意瞭解原始碼的朋友直接求求交流分享技術 一七九一七四三三八零

服務註冊中心 :eureka-server

新建一個springboot專案:eureka-server,其pom.xml配置如下

<properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Dalston.SR1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
複製程式碼

想要實現一個服務註冊中心的功能非常簡單,只需要在專案的啟動類EurekaServerApplication上使用@EnableEurekaServer註解即可

@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication{
 
    public static void main(String[] args) {
        new SpringApplicationBuilder(EurekaServerApplication.class)
                    .web(true).run(args);
    }
}
複製程式碼

預設情況下,該服務註冊中心也會將自己作為客戶端來嘗試註冊它自己,所以我們需要禁用它的客戶端註冊行為,只需要在application.properties配置檔案中增加如下資訊:

spring.application.name=eureka-server
server.port=1001
eureka.instance.hostname=localhost
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
複製程式碼

啟動EurekaServerApplication,訪問 http:/ /localhost:9001/ 可以看到Eureka的頁面。

服務提供方 :eureka-client

每一個例項註冊之後需要向註冊中心傳送心跳,當client向server註冊時,它會提供一些後設資料,例如主機和埠,URL,主頁等。Eureka server 從每個client例項接收心跳訊息。 如果心跳超時,則通常將該例項從註冊server中刪除。

新建一個springboot專案:eureka-client,其pom.xml配置如下:

<properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Dalston.SR1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
複製程式碼

想要實現一個服務提供方也很簡單,只要在專案的啟動類EurekaClientApplication上使用@EnableEurekaClient註解即可

@EnableEurekaClient
@SpringBootApplication
public class EurekaClientApplication {
 
     public static void main(String[] args) {
            new SpringApplicationBuilder(
                    EurekaClientApplication.class)
                .web(true).run(args);
        }
}
複製程式碼

在application.properties中進行如下配置

spring.application.name=eureka-client
server.port=9002
eureka.client.serviceUrl.defaultZone=http://localhost:9001/eureka/
複製程式碼

啟動EurekaClientApplication類

重新整理 http:/ /localhost:9001/, 可以看到我們們的服務提供方已經註冊到了服務註冊中心

新建一個DiscoveryController 使用discoveryClient.getServices()獲取已經註冊的服務名,使用@value將配置檔案中的資訊賦值到ip

@RestController
public class DiscoveryController {
    
    @Autowired
    private DiscoveryClient discoveryClient;
    @Value("${server.port}")
    private String ip;
    
    @GetMapping("/client")
    public String client() {
        String services = "Services: " + discoveryClient.getServices()+" ip :"+ip;
        
        System.out.println(services);
        return services;
    }
}
複製程式碼

訪問:http:/ /localhost:9002/client

最後說明一下@EnableEurekaClient 與@EnableDiscoveryClient這兩個註解

 首先這個兩個註解都可以實現服務發現的功能,在spring cloud中discovery service有許多種實現(eureka、consul、 zookeeper等等)

 @EnableEurekaClient基於spring-cloud-netflix。服務採用eureka作為註冊中心,使用場景較為單一。

 @EnableDiscoveryClient基於spring-cloud-commons。服務採用其他註冊中心。

相關文章