Eureka是一個基于rest的服務啊片。在AWS(亞馬遜云)上主要用于服務定位歉备,以便實現(xiàn)負載均衡及中間層服務失效備援谈竿。我們管這個服務叫Eureka Server瓦戚。Eureka也提供基于Java的客戶端組件Eureka client沮尿,使連接服務更容易〗辖猓客戶端有一個內(nèi)置的負載均衡器畜疾,提供基本的輪詢負載均衡。Netflix(奈飛)使用了一個更復雜的負載均衡器印衔,提供基于通訊量啡捶,資源使用,錯誤狀態(tài)等因素的權(quán)重負載均衡当编。
下面使用IDEA創(chuàng)建Eureka server及Eureka clinet
1.Eureka server
IDEA中創(chuàng)建MAVEN的parent工程届慈,注意不要勾選create from archetype
創(chuàng)建好后刪除src文件夾,工程右鍵創(chuàng)建Module忿偷。選擇spring initialir如果沒有選項參考1.1金顿。
1.1 IDEA安裝插件
settings -> Plugins 搜索spring boot勾選,重啟IDEA
1.2 選擇Spring Initializr鲤桥,并next
1.3 工程配置揍拆,注意這里JavaVersion最高只能選1.8,工程的SDK配置也要選1.8茶凳。
1.4 選擇Cloud Discovery 勾選Eureka Server
1.5 可以看到已經(jīng)加好相關(guān)依賴和包
<?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.gao</groupId>
<artifactId>eurekaserver</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>eurekaserver</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.8.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>
<spring-cloud.version>Dalston.SR4</spring-cloud.version>
</properties>
<dependencies>
<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>${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>
1.6 在啟動application中加上@EnableEurekaServer注解
@EnableEurekaServer
@SpringBootApplication
public class EurekaserverApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaserverApplication.class, args);
}
}
1.7 配置yml
server:
port: 8888
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
1.8 啟動工程并訪問
2.Eureka client
2.1 步驟與server類似嫂拴,選擇Eureka Discovery
2.1 在啟動application中加上@EnableEurekaClient,啟動工程贮喧,這時 http://localhost:8888/ 可以看到
2.2 在啟動application中加上@RestController筒狠,接收請求及參數(shù)并輸出當前端口配置信息
@SpringBootApplication
@EnableEurekaClient
@RestController
public class EurekaclientApplication {
@Value("${server.port}")
private String port;
@RequestMapping("/hi")
public String home(@RequestParam String name) {
return "hi "+name+",i am from port:" +port;
}
public static void main(String[] args) {
SpringApplication.run(EurekaclientApplication.class, args);
}
}
2.3 換一個端口,再啟動一個client箱沦,這時 http://localhost:8888/ 可以看到實例數(shù)增加
2.4 使用中可以發(fā)現(xiàn)如果Eureka server停止服務辩恼,Eureka client需要重新運行才能注冊服務。后續(xù)需要找到解決這個問題的方案。
3.Eureka高可用
3.1注冊中心只使用單一節(jié)點的話可用性低灶伊,下面配置一下Eureka的集群疆前,以3個節(jié)點為例
在Eureka Server工程中加入如下3個配置文件
application-peer1.yml:
server:
port: 8899
spring:
profiles: peer1
eureka:
instance:
hostname: peer1
preferIpAddress: true
client:
serviceUrl:
defaultZone: http://peer2:9988/eureka/,http://peer3:9999/eureka/
application-peer2.yml:
server:
port: 9988
spring:
profiles: peer2
eureka:
instance:
hostname: peer2
preferIpAddress: true
client:
serviceUrl:
defaultZone: http://peer1:8899/eureka/,http://peer3:9999/eureka/
application-peer3.yml:
server:
port: 9999
spring:
profiles: peer3
eureka:
instance:
hostname: peer3
preferIpAddress: true
client:
serviceUrl:
defaultZone: http://peer1:8899/eureka/,http://peer2:9988/eureka/
3.2 修改host文件
3.3 分別使用3個配置文件,啟動3個工程
也可以選擇打包工程用命令啟動工程
java -jar eurekaserver-0.0.1-SNAPSHOT.jar - -spring.profiles.active=peer1
3.4 啟動Eureka Client
1.配置文件修改為端口號為8899Eureka Server
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8899/eureka/
...
2.使用8001和8002端口啟動2個Eureka Client
此時訪問http://localhost:8899/ 可以看到其他節(jié)點聘萨,以及注冊的Eureka Client
訪問http://localhost:9988/ http://localhost:9999/同理
3.5 驗證(參考4.SpringCloud-Feign)
Feign工程修改配置文件
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8899/eureka/
...
訪問http://localhost:8008/hi?name=forezp 可以看到輪詢兩個Eureka Client
此時可以關(guān)閉8899端口的服務竹椒,再次訪問Feign,仍然可以提供服務米辐,可見Eureka Server集群已經(jīng)發(fā)揮作用胸完。
如果再次啟動8899端口的服務,可以看到它重新加入了集群儡循,而且Eureka Client已經(jīng)恢復注冊了
4.了解Eureka
https://github.com/Netflix/eureka/wiki/Eureka-at-a-glance
4.1 哪里需要Eureka
在亞馬遜云中舶吗,因為業(yè)務本身的特點,服務器啟停頻繁择膝。不像傳統(tǒng)業(yè)務的負載均衡那樣誓琼,服務器之間都知道IP地址及主機名。在亞馬遜云負載均衡需要更高的復雜性肴捉,不斷的注冊或注銷服務器腹侣,因為亞馬遜云目前還不提供中間層負載均衡,Eureka填補了這個空白齿穗。
4.2 Eureka和AWS ELB(亞馬遜云彈性負載均衡)的區(qū)別
https://aws.amazon.com/cn/elasticloadbalancing/
亞馬遜ELB是一個為了將邊緣服務暴露給終端用戶負載均衡解決方案傲隶,Eureka彌補了中間層負載均衡的需求。理論上可以把中間層放到ELB的后邊窃页,經(jīng)典的例子是在EC2(Elastic Compute Cloud跺株,亞馬遜彈性計算云)中,中間層外網(wǎng)暴露服務脖卖,這么做會失去全部亞馬遜安全組的有效性乒省。
AWS ELB是一個傳統(tǒng)的基于代理的負載均衡解決方案,但是Eureka不一樣畦木,它發(fā)生在實例/服務器/主機層面袖扛。客戶端實例知道關(guān)于服務器通信的全部信息十籍,這樣做的好處和壞處取決于如何看待它蛆封。比如基于AWS現(xiàn)在提供的負載均衡尋找一個粘性用戶的session,Eureka沒有提供開箱機用的解決方案勾栗。在Netflix惨篱,更喜歡無狀態(tài)服務,這會更有利于擴展模型围俘,Eureka更適合這種情況妒蛇。
代理負載均衡和Eureka另一個重要區(qū)別是机断,使用Eureka時程序可以在負載均衡中斷時更有彈性,因為關(guān)于可用服務的信息在客戶端有保存绣夺,只需要少量的存儲,換回更好的彈性欢揖。
4.3 Eureka和Route53區(qū)別
Route53是命名服務陶耍,Eureka可以為中間層服務器提供相同功能,僅此而已她混。Route53是DNS(域名服務器)烈钞,即使是非AWS數(shù)據(jù)中心,它也可以承載您的DNS記錄坤按。Eureka類似于內(nèi)部的DNS毯欣,與網(wǎng)絡(luò)上DNS服務器無關(guān)。Eureka也是區(qū)域隔離的臭脓,它不知道AWS其他區(qū)域中的服務器酗钞,保持信息的主要目的是在區(qū)域內(nèi)進行負載均衡。
4.4在Netflix怎么用Eureka
在Netflix来累,Eureka除了在負載均衡中充當重要部分砚作,還有以下目的:
a.使用Netflix Asgard (一個使云部署更容易的開源服務)進行紅黑部署,Eureka和Asgard相互配合以便快速嘹锁、無縫的切換新舊版本的服務部署葫录,特別是啟動100個實例來部署一個版本會花費很長時間。
Asgard : https://github.com/Netflix/asgard
紅黑部署: http://www.reibang.com/p/076243217952
b.為了cassandra部署领猾,把實例移出維護
c.memcached緩存服務米同,來識別環(huán)中的節(jié)點
d.用來運輸其他附加程序關(guān)于服務的特殊的元數(shù)據(jù)