為什么要使用服務(wù)治理?
? 設(shè)想一下,我們正在寫代碼使用了提供REST API或者Thrift API的服務(wù),為了完成一次服務(wù)請(qǐng)求,代碼需要知道服務(wù)實(shí)例的網(wǎng)絡(luò)位置(IP地址和端口)。傳統(tǒng)應(yīng)用都運(yùn)行在物理硬件上,服務(wù)實(shí)例的網(wǎng)絡(luò)位置都是相對(duì)固定的。并且隨著系統(tǒng)功能越來越復(fù)雜,相應(yīng)的硬件配置也會(huì)越來越多比如集群配置,服務(wù)配置等。這些配置都需要手工去維護(hù),這種維護(hù)工作不僅復(fù)雜而且工作量非常大。
因此在微服務(wù)中,服務(wù)治理就應(yīng)運(yùn)而生了。服務(wù)治理框架有很多,但是核心的功能就是兩點(diǎn),服務(wù)注冊和服務(wù)發(fā)現(xiàn)。
- 服務(wù)注冊:在服務(wù)治理框架中,通常都會(huì)構(gòu)建一個(gè)注冊中心,每個(gè)服務(wù)單元向注冊中心登記自己提供的服務(wù),包括服務(wù)的主機(jī)與端口號(hào)、服務(wù)版本號(hào)、通訊協(xié)議等一些附加信息。注冊中心按照服務(wù)名分類組織服務(wù)清單,同時(shí)還需要以心跳檢測的方式去監(jiān)測清單中的服務(wù)是否可用,若不可用需要從服務(wù)清單中剔除,以達(dá)到排除故障服務(wù)的效果。
- 服務(wù)發(fā)現(xiàn):在服務(wù)治理框架下,服務(wù)間的調(diào)用不再通過指定具體的實(shí)例地址來實(shí)現(xiàn),而是通過服務(wù)名發(fā)起請(qǐng)求調(diào)用實(shí)現(xiàn)。服務(wù)調(diào)用方通過服務(wù)名從服務(wù)注冊中心的服務(wù)清單中獲取服務(wù)實(shí)例的列表清單,通過指定的負(fù)載均衡策略取出一個(gè)服務(wù)實(shí)例位置來進(jìn)行服務(wù)調(diào)用。
Netflix Eureka搭建高可用注冊中心
我們這里為了方便整合版本,我們直接使用IDEA來創(chuàng)建服務(wù)端。
創(chuàng)建Eureka Server
1.點(diǎn)擊File 選擇NEW -> Project

2.點(diǎn)擊下一步進(jìn)入到創(chuàng)建頁面

3.點(diǎn)擊下一步,選擇Cloud Dicovery -- Eureka Server

4.點(diǎn)擊下一步直至創(chuàng)建完成。
5.查看pom.xml以及maven依賴
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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.cloud</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-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>${spring-cloud.version}</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>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
</repository>
</repositories>
</project>

6.在啟動(dòng)引導(dǎo)類中加入注解 @EnableEurekaServer
@EnableEurekaServer
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
7.在resources文件夾下創(chuàng)建兩個(gè)properties。

application-peer1.properties
#服務(wù)ID
spring.application.name=eureka-server
#端口
server.port=1111
#實(shí)例主機(jī)名
eureka.instance.hostname=peer1
#是否注冊自己
eureka.client.register-with-eureka=true
#是否需要檢索服務(wù)
eureka.client.fetch-registry=true
#是否開啟自我保護(hù)
eureka.server.enable-self-preservation=false
#默認(rèn)URL
eureka.client.service-url.defaultZone=http://peer2:1112/eureka/
#是否啟動(dòng)健康診斷
eureka.client.healthcheck.enabled=true
application-peer2.properties
spring.application.name=eureka-server
server.port=1112
eureka.instance.hostname=peer2
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true
eureka.server.enable-self-preservation=false
eureka.client.service-url.defaultZone=http://peer1:1111/eureka/
eureka.client.healthcheck.enabled=true
注意由于是高可用注冊中心,他們既是服務(wù)提供方也是服務(wù)消費(fèi)方,所以對(duì)應(yīng)的客戶端URL(eureka.client.service-url.defaultZone)是指向?qū)Ψ降摹?/p>
啟動(dòng)Eureka Server
1.前期工作已經(jīng)做完了。我們現(xiàn)在需要將高可用注冊中心啟動(dòng)起來,首先我們需要改變一下本地訪問路徑。

2.打開對(duì)應(yīng)的文件。修改其內(nèi)容。

3.IDEA的啟動(dòng)配置修改

4.添加springboot啟動(dòng)配置

5.進(jìn)行簡單的配置,包括server的名稱,啟動(dòng)類的選擇,還有加載配置。


我們可以看到 兩個(gè)除了啟動(dòng)參數(shù)不同之外,其他的都是一樣的。
6.接下來讓我們啟動(dòng)一下看看效果。

我們可以看到節(jié)點(diǎn)分片(DS Replicas)中已經(jīng)有了 peer2,同樣,如果我們訪問http://localhost:1112/,他的分片就是peer1。多節(jié)點(diǎn)的配置已經(jīng)完成。
我們從圖中 Instances currently registered with Eureka 下看到了這兩個(gè)服務(wù)的注冊信息,所以我們說高可用注冊中心的服務(wù)提供者也是服務(wù)的消費(fèi)者。
總結(jié)
我們發(fā)現(xiàn)其實(shí)搭建 Eureka Server 其實(shí)不難,但是我們要做到知其然并知其所以然。