前言:
微服務(wù)化要配合自動(dòng)化部署與自動(dòng)化測(cè)試以實(shí)現(xiàn)快速交付
微服務(wù)化容易出現(xiàn)的問(wèn)題有服務(wù)太多的情況下難以發(fā)現(xiàn)和治理玷室、調(diào)用鏈過(guò)長(zhǎng)難以定位問(wèn)題晓勇、調(diào)用鏈過(guò)長(zhǎng)響應(yīng)時(shí)間隨之增加陶耍、系統(tǒng)過(guò)多難以部署和測(cè)試翼虫、系統(tǒng)間復(fù)雜度隨著服務(wù)增多而增大莱衩。
Eureka解決了服務(wù)注冊(cè)與發(fā)現(xiàn)問(wèn)題联贩。
代碼:
https://github.com/KouLouYiMaSi/springcloud
1珍剑、服務(wù)注冊(cè)于發(fā)現(xiàn)
1.1:什么是服務(wù)注冊(cè)與發(fā)現(xiàn)?
- 服務(wù)發(fā)現(xiàn):顧名思義剪验,發(fā)現(xiàn)一個(gè)服務(wù)
- 怎么發(fā)現(xiàn)?就是找IP和端口啊
- 傳統(tǒng)方式怎么找前联?在調(diào)用方里面配置好啊功戚。
- 云服務(wù)和docker等讓每次啟動(dòng)服務(wù)的IP都不一樣怎么辦?傳統(tǒng)方式就涼拌了似嗤,服務(wù)少還好啸臀,每次改改配置文件,服務(wù)多呢双谆?挨個(gè)改壳咕?不能夠
- 服務(wù)注冊(cè):給每個(gè)服務(wù)提供一個(gè)注冊(cè)中心,服務(wù)上線的時(shí)候都把自己的IP端口信息注冊(cè)到注冊(cè)中心顽馋,有沒(méi)有發(fā)現(xiàn)原來(lái)每個(gè)服務(wù)的分散式配置都集中到注冊(cè)中心了谓厘?
1.2:Eureka的服務(wù)注冊(cè)與發(fā)現(xiàn)過(guò)程
- EurekaServer啟動(dòng)的時(shí)候注冊(cè)自己的IP端口服務(wù)名稱等信息
- EurekaClient作為java客戶端,在服務(wù)啟動(dòng)后周期性的(默認(rèn)30s)向EurekaServer發(fā)送心跳
- EurekaServer在一定時(shí)間(默認(rèn)90s)沒(méi)有收到某個(gè)服務(wù)的心跳就會(huì)注銷該實(shí)例寸谜,EurekaClient發(fā)送canel命令后也會(huì)注銷該實(shí)例
- EurekaServer之間會(huì)相互復(fù)制注冊(cè)表信息
-
EurekaClient會(huì)緩存注冊(cè)表信息
2竟稳、實(shí)戰(zhàn)Eureka
參見(jiàn)代碼地址:https://github.com/KouLouYiMaSi/springcloud
工具:Intelij Idea
2.1、構(gòu)建步驟
- 構(gòu)建一個(gè)主maven項(xiàng)目spring-cloud熊痴,pom如下
<?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>com.huo</groupId>
<artifactId>spring-cloud</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>eureka-server</module>
<module>eureka-server-1</module>
<module>eureka-server-2</module>
<module>service-hi</module>
</modules>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
<relativePath/>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</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>${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>
</project>
-
構(gòu)建3個(gè)maven module他爸,eureka-server、eureka-server-1果善、eureka-server-2
在springcloud項(xiàng)目上右鍵诊笤,點(diǎn)new,點(diǎn)Module
選擇spring initializer
填寫必要信息后勾選
構(gòu)建完成打開(kāi)eureka-server這個(gè)子項(xiàng)目巾陕,刪除不必要信息
<?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>com.huo</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>com.huo</groupId>
<artifactId>spring-cloud</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
</project>
- 為了直觀讨跟,我們不用同一個(gè)起多個(gè)實(shí)例纪他,而是通過(guò)復(fù)制2個(gè)eureka-server來(lái)實(shí)現(xiàn)直觀的集群,點(diǎn)擊eureka-server項(xiàng)目ctrl+c ctrl+v晾匠,改名字eureka-server-1和eureka-server-2
- 修改每個(gè)server的yml文件
----eureka-server茶袒,這行不要復(fù)制,下面信息復(fù)制到eureka-server的yml凉馆,以此類推-----
server:
port: 20001
eureka:
instance:
hostname: server1
client:
# 表示是否注冊(cè)自身到eureka服務(wù)器,以供其他服務(wù)發(fā)現(xiàn)
register-with-eureka: true
# 是否從eureka上獲取注冊(cè)信息
fetch-registry: true
# 表示自己的另外兩個(gè)同伴的IP和端口
service-url:
defaultZone: http://server2:20002/eureka/,http://server3:20003/eureka/
----eureka-server-1-----
server:
port: 20002
eureka:
instance:
hostname: server2
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://server1:20001/eureka/,http://server3:20003/eureka/
----eureka-server-2-----
server:
port: 20003
eureka:
instance:
hostname: server3
client:
# 表示是否注冊(cè)自身到eureka服務(wù)器
register-with-eureka: true
# 是否從eureka上獲取注冊(cè)信息
fetch-registry: true
service-url:
defaultZone: http://server1:20001/eureka/,http://server2:20002/eureka/
- 每個(gè)main文件增加注解就可以了
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
- 然后配置一下server1薪寓、server2、server3的host澜共,使用switchhost或者直接去etc下面改host文件
server1 127.0.0.1
server2 127.0.0.1
server3 127.0.0.1
-
構(gòu)建集群完成打開(kāi)瀏覽器隨便輸入localhost:20001或者localhost:20002或者localhost:20003訪問(wèn)就可以看到信息了
2.2向叉、重要配置信息說(shuō)明
## eureka : 主要配置屬性在EurekaInstanceConfigBean和EurekaClientConfigBean中
eureka:
instance:
# hostname: 127.0.0.1
# 使用IP注冊(cè)
preferIpAddress: true
# 心跳間隔
lease-renewal-interval-in-seconds: 3
# 服務(wù)失效時(shí)間: 如果多久沒(méi)有收到請(qǐng)求,則可以刪除服務(wù)
lease-expiration-duration-in-seconds: 7
client:
# 關(guān)閉eureka client
# enabled: false
# 注冊(cè)自身到eureka服務(wù)器
registerWithEureka: true
# 表示是否從eureka服務(wù)器獲取注冊(cè)信息
fetchRegistry: false
# 客戶端從Eureka Server集群里更新Eureka Server信息的頻率
eureka-service-url-poll-interval-seconds: 60
# 定義從注冊(cè)中心獲取注冊(cè)服務(wù)的信息
registry-fetch-interval-seconds: 5
# 設(shè)置eureka服務(wù)器所在的地址嗦董,查詢服務(wù)和注冊(cè)服務(wù)都需要依賴這個(gè)地址
serviceUrl:
defaultZone: http://127.0.0.1:10761/eureka/
# 設(shè)置eureka服務(wù)器所在的地址植康,可以同時(shí)向多個(gè)服務(wù)注冊(cè)服務(wù)
# defaultZone: http://192.168.21.3:10761/eureka/,http://192.168.21.4:10761/eureka/
server:
# renewal-percent-threshold: 0.1
# 關(guān)閉自我保護(hù)模式
enable-self-preservation: false
# Eureka Server 自我保護(hù)系數(shù),當(dāng)enable-self-preservation=true時(shí)展懈,啟作用
# renewal-percent-threshold:
# 設(shè)置清理間隔,單位為毫秒,默認(rèn)為0
eviction-interval-timer-in-ms: 3000
# 設(shè)置如果Eureka Server啟動(dòng)時(shí)無(wú)法從臨近Eureka Server節(jié)點(diǎn)獲取注冊(cè)信息销睁,它多久不對(duì)外提供注冊(cè)服務(wù)
wait-time-in-ms-when-sync-empty: 6000000
# 集群之間相互更新節(jié)點(diǎn)信息的時(shí)間頻率
peer-eureka-nodes-update-interval-ms: 60000
2.3、服務(wù)注冊(cè)
- 隨便創(chuàng)建一個(gè)spring boot項(xiàng)目
- 修改下yml配置
server:
port: 8770
enable-self-preservation: false
spring:
application:
name: service-hi
eureka:
client:
serviceUrl:
defaultZone: http://localhost:20001/eureka/,http://localhost:20002/eureka/,http://localhost:20003/eureka/
-
打開(kāi)localhost:20001存崖,打開(kāi)20002和20003發(fā)現(xiàn)沒(méi)有這個(gè)SERVICE-HI
總結(jié):
當(dāng)使用單節(jié)點(diǎn)模式的時(shí)候把registerWithEureka設(shè)置為false冻记,集群模式設(shè)置為true(默認(rèn)),集群模式設(shè)置為client可以保證自己被其他服務(wù)發(fā)現(xiàn),同時(shí)也可以像客戶端一樣從其他server那里同步注冊(cè)表信息