1. 程式人生 > >使用Spring Cloud搭建服務註冊中心

使用Spring Cloud搭建服務註冊中心

gets log 筆記本電腦 這樣的 ins 閱讀 筆記本 快速 名稱

我們在之前的博客中已經介紹過阿裏的分布式服務框架dubbo【Linux上安裝Zookeeper以及一些註意事項】【一個簡單的案例帶你入門Dubbo分布式框架】,但是小夥伴們應該也看到了,阿裏的dubbo無法單獨完成工作,我們還要借助於Apache上的開源框架zookeeper(不是必須,但是最佳實踐莫過於zookeeper),使用zookeeper作為服務註冊中心,才能實現一個較好的分布式應用。與dubbo不同的是,Spring Cloud是一個一站式分布式框架,Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智能路由,微代理,控制總線)。分布式系統的協調導致了樣板模式, 使用Spring Cloud開發人員可以快速地支持實現這些模式的服務和應用程序。他們將在任何分布式環境中運行良好,包括開發人員自己的筆記本電腦,裸機數據中心,以及Cloud Foundry等托管平臺。那麽今天我希望通過一個簡單的案例帶小夥伴們來了解下Spring Cloud。

OK,那麽本文我主要想介紹下在Spring Cloud中使用Eureka搭建一個服務註冊中心,然後再向其中註冊服務。由於Spring Cloud是在Spring Boot的基礎上構建分布式服務的,所以閱讀本文需要有一點Spring Boot的知識儲備,如果小夥伴們對Spring Boot尚不太熟悉的話,可以先參考下【https://github.com/lenve/JavaEETest】。
OK,那麽上面所提到的是閱讀本文所需要具備的基礎知識,在此基礎之上我們來看看怎麽樣利用Spring Cloud中的Eureka來搭建服務註冊中心。

首先我要說的是Spring Cloud並不是一個東西,和Hadoop類似,Spring Cloud也包含了許多個子項目,我們今天要看的Eureka只是其中的一個子項目,Eureka的功能有點類似於我們之前寫過的zookeeper,它是一個服務治理組件,包含了服務註冊中心、服務註冊與發現機制。其他的組件我們這裏先不做介紹,後面的系列文章都會一一提及到。

OK,廢話說了一籮筐,上代碼吧。

創建服務註冊中心

創建一個普通的Spring Boot工程

首先我們需要創建一個普通的Spring Boot工程,命名為eureka-server,普通到什麽程度呢?就是一個starter都不需要添加,創建成功之後就只引用了一個父starter。

添加Eureka依賴

工程創建成功之後,向pom.xml文件中添加eureka-server的依賴,目前eureka的穩定版本是Dalston.SR3,添加完依賴之後,pom.xml文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>org.sang</groupId>
<artifactId>eureka-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>eureka-server</name>
<description>Demo project for Spring Boot</description>

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>

<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.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>

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

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
那麽這裏依賴的添加我主要參考了Eureka官網的 http://projects.spring.io/spring-cloud/。

啟動一個服務註冊中心

啟動一個服務註冊中心的方式很簡單,就是在Spring Boot的入口類上添加一個@EnableEurekaServer註解,如下:

@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
配置服務註冊中心

最後我們再做一點簡單的配置就可以了,配置就寫在Spring Boot的配置文件application.properties中,寫法如下:

server.port=1111
eureka.instance.hostname=localhost
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
OK,那麽關於這幾行註釋,我說如下幾點:

1.server.port=1111表示設置該服務註冊中心的端口號
2.eureka.instance.hostname=localhost表示設置該服務註冊中心的hostname
3.eureka.client.register-with-eureka=false,由於我們目前創建的應用是一個服務註冊中心,而不是普通的應用,默認情況下,這個應用會向註冊中心(也是它自己)註冊它自己,設置為false表示禁止這種默認行為
4.eureka.client.fetch-registry=false,表示不去檢索其他的服務,因為服務註冊中心本身的職責就是維護服務實例,它也不需要去檢索其他服務

測試

OK,做完這一切之後,我們就可以啟動這一個Spring Boot 服務,服務啟動成功之後,在瀏覽器中輸入:http://localhost:1111就能夠看到如下頁面:

OK,看到上面這個頁面之後,表示你的服務註冊中心已經搭建好了。

小結

我們之前專門有一篇博客介紹如何在Linux上安裝zookeeper【Linux上安裝Zookeeper以及一些註意事項】,但是對於Eureka卻不存在這樣的問題,因為Eureka中的服務註冊中心實際上是一個Spring Boot工程,而Spring Boot工程我們知道可以直接打成一個jar包,然後java -jar命令就可以運行,不管Windows還是Linux上,運行方式都是一致的。

註冊服務提供者

OK,那麽現在服務註冊中心有了之後,我們可以考慮向這個服務註冊中心註冊一個服務提供者了。

創建一個新的Spring Boot工程

還是創建一個Spring Boot工程,這次創建比之前創建多一個步驟,在創建的時候選中web的starter,我們來創建一個web工程,在IntelliJ IDEA中創建的時候選中web,如下:

添加Eureka依賴

在創建好的工程中,我們需要添加Eureka依賴,添加方式如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.sang</groupId>
<artifactId>provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>provider</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<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.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
創建應用的入口

這是一個web工程,所以我們添加一個Controller,在該Controller中提供一個訪問入口,如下:

@RestController
public class HelloController {
private final Logger logger = Logger.getLogger(getClass());
@Autowired
private DiscoveryClient client;

@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String index(www.zzktv.cn) {
List<ServiceInstance> instances = client.getInstances("hello-service");
for (int i = 0; i < instances.size(www.7881188.cn ); i++) {
logger.info("/hello,host:" + instances.get(i).getHost() + ",service_id:" + instances.get(i).getServiceId());
}
return "Hello World";
}
}
這裏創建服務之後,在日誌中將服務相關的信息打印出來。

激活Eureka中的DiscoveryClient

在Spring Boot的入口函數處,通過添加@EnableDiscoveryClient註解來激活Eureka中的DiscoveryClient實現(因為我們在HelloController中註入了DiscoveryClient)。

@EnableDiscoveryClient
@SpringBootApplication
public class www.lgzxyl.com ProviderApplication {

public static void main(String[www.wmyl999.cn] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
配置服務名稱和註冊中心地址

最後的最後,我們在application.properties文件中配置一下服務名和註冊中心地址即可,如下:

spring.application.name=hello-service
eureka.client.service-url.www.thd540.com defaultZone=http://localhost:1111/eureka
這兩行代碼的含義很簡單,我就不多說了。

測試

做完這一切之後,我們就可以來測試了,直接運行這個Spring Boot工程,運行成功之後,我們刷新剛才的http://localhost:1111,就可以看到有一個服務已經註冊成功了。如下:

同時,我們查看這個服務提供者運行日誌,也可以看到服務的信息,如下:

小結

OK,如此之後,我們一個服務註冊中心就搭建成功了,同時也有一個服務提供者成功的註冊了。但是這樣還有一個小問題,那就是我們這裏是一個單節點的服務註冊中心,一旦發生了故障整個服務就癱瘓了,所以在實際應用中,我們需要搭建高可用註冊中心,那麽關於高可用註冊中心如何搭建的問題,我們將在下篇文章中來介紹。

使用Spring Cloud搭建服務註冊中心