rties spring.application.name=eureka-server
server.port=1111
eureka.instance.hostname=peer1
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true
eureka.client.service-url.defaultZone=http://peer2:1112/eureka/
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.client.service-url.defaultZone=http://peer1:1111/eureka/
在本地修改配置文件/etc/hosts ,Windows下面是C:\Winows\System32\drivers\etc\hosts。
添加如下内容
127.0.0.1 peerl
127.0.0.1 peer2
如下:
首先在idea 或者eclipse 使用mvn clean 和 mvn install命令,会直接打包,这里注意,一定要在pom.xml中配置如下,否则使用java -jar
会报没有主清单属性的错误。
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
打包完成后,切换到eureka-server
项目,再切换到target目录下,此时有mvn install 的jar包,使用java -jar eureka-server-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer1
和 java -jar eureka-server-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer2
两个命令,启动两个例程。起来过后分别访问 http://localhost:peer1/eureka/ 和 http://localhost:peer2/eureka/ 主页,发现对应的注册中心分别注册进去了,而且分片也处于可用分片状态。
到现在为止,我们已经让两个注册中心分别注册各自的服务了,还记得上面还有一个server-provider
服务吗?我们也让server-provider分别注册到这两个注册中心。
在server-provider
中修改对应的配置文件
eureka.client.service-url.defaultZone=http://peer1:1111/eureka, http://peer2:1112/eureka/
启动程序,发现http://localhost:1111/ 和 http://localhost:1112/ 中都注册了server-provider
服务
访问http://localhost:8080/hello,你会发现页面上显示出来hello world
,断开其中的任意一个注册中心,hello world
也能够显示出来。也就是说,server-provider 分别对两个注册中心分别注册了各自的服务,由两个注册中心以轮询的方式提供服务。断开其中一个注册中心,还有另外一个注册中心可以提供服务,这也是Eureka 高可用的体现。
? 注意事项
- 如果
application-peer1.properties
和 application-peer2.properties
中的eureka.instance.hostname
与 本地hosts文件中的名称不一致的话,那么注册中心启动后,会使分片处于不可用的状态, spring.application.name
表示的是实例的名称,也就是如下的地方
当server-provider
注册进来的时候,高可用配置的注册中心会以轮询的方式提供服务,每次提供服务是哪个注册中心是不可预知的。
如我们不想使用主机名来定义注册中心的地址,也可以使用IP地址的形式, 但是需要在配置文件中增加配置参数eureka.instance.prefer-ip-address=true, 该值默认为false。
服务发现与消费
通过上述的内容介绍与实践,我们已经搭建起来微服务架构中的核心组件— 服务注册中心(包括单节点模式和高可用模式)。并用server-provider
注册双节点,在页面上发起一个url请求时,注册中心找到server-provider
,并有两个节点以轮询的方式提供服务。
下面就来构建一个消费者
,它主要完成两个目标:发现服务
和消费服务
。其中,服务发现的任务由Eureka
客户端完成,消费服务
的任务由Ribbon
来完成。
先来认识一下什么是Ribbon
:Ribbon是客户端负载均衡器
,可以让您对HTTP和TCP客户端的行为进行控制。 Feign已经使用了Ribbon,如果你使用了@FeignClient
,那么Ribbon也适用。
Ribbon
可以在通过客户端中配置的ribbonServerList
服务端列表去轮询访问以达到负载均衡的效果。当ribbon
与Eureka
联合使用时,Ribbon
的服务实例清单RibbonServerList
会被DiscoveryEnabledNIWSServerList
重写,扩展成从Eureka注册中心中获取服务端列表。同时它也会用NIWSDiscoveryPing来取代Ping,它将职责委托给Eureka来确定服务端是否启动,我们目前不细致探讨Ribbon的细节问题。
下面通过一个简单的实例,看看Eureka的服务治理体系下如何实现服务的发现与消费。
- 首先,先做一些准备工作,启动之前实现的服务注册中心
eureka-server
以及server-provider
服务,为了实现ribbon的负载均衡功能,我们通过java -jar
命令行的方式来启动两个不同端口的server-provider
- 启动一个eureka-server即可
- 使用
java -jar service-provider-0.0.1-SNAPSHOT.jar --server.port=8081
和 java -jar service-provider-0.0.1-SNAPSHOT.jar --server.port=8082
来启动两个server-provider 进程
- 启动完成后,可见注册中心注册了两个server-provider 实例
- 新创建一个SpringBoot 工程,命名为ribbon-con