SpringCloud(一):服务注册中心与集群
一、概念部分
SpringCloud中的核心组件Eureka提供了服务注册和服务发现功能,管理分布式系统中的各种服务,比如注册、发现、熔断、负载均衡等。
假设一个场景:服务A的某些业务需要调用服务B的某些功能。
使用服务中心前,服务之间的调用关系如下

使用服务注册中心后,服务之间的调用关系如下

服务A和服务B首先将自己注册到服务注册中心,然后服务A不再直接调用服务B,而是通过服务注册中心去获取服务B的调用。
假设一个场景:服务A需要调用服务B,服务B需要调用服务C
他们的调用关系为 A->B->C
使用服务注册中心,他们的调用关系图如下:

服务A、服务B、服务C都注册都服务注册中心,然后服务A通过服务注册中心获取到服务B的调用,服务B再通过服务注册中心获取到服务C的调用。
分布式系统中所有的服务都将注册到注册中心,服务直接都不能直接调用。所有的调用必须通过注册中心来调用。
通过服务中心来调用服务,不需要关心所调用服务所在机器的ip地址或其他信息,每个服务注册到服务中心时只需提供一个注册名称,调用时将通过服务名称来调用。
假设一个场景:服务A需要调用服务B,并且要保证服务B的高可用性,所以服务B有多个机器实例来组成集群。,关系图如下:

我们可以提供几台相同的服务注册到服务中来做集群和负载均衡,服务调用者无需关心服务所在机器的信息,我们可以很方便的做很多高级的功能,比如监控服务器调用成功率来做熔断,移除服务列表中的故障点;监控服务调用时间来对不同的服务器设置不同的权重等等。
二、代码示例
1.在build.gradle中添加依赖
compile('javax.servlet:javax.servlet-api:3.1.0')
compile('org.springframework.cloud:spring-cloud-starter')
compile('org.springframework.cloud:spring-cloud-starter-eureka-server’)
2.在应用代码处启用注解
/**
* 服务注册中心
*/
@SpringBootApplication
@EnableEurekaServer // 启用Eureka服务
public class ServiceRegistryApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceRegistryApplication.class, args);
}
}
3.新建配置文件application.yml
#服务器配置
server:
#端口
port: 9000
#配置Spring
spring:
application:
#应用名称 (服务注册中心)
name: service-registry
#服务器注册发现配置
eureka:
client:
service-url:
#服务注册中心地址,查询服务和注册服务都需要依赖这个地址,默认地址:[http://localhost:8761/eureka](http://localhost:8761/eureka) ,可以配置多个地址用逗号分隔
defaultZone: http://localhost:${server.port}/eureka
#禁用将自己注册到自己Eureka Server
register-with-eureka: false
#禁用从Eureka Server 获取注册信息
fetch-registry: false
4.运行项目,浏览器访问 http://localhost:9000

其他客户端就可以通过http://localhost:9000/eureka 来注册自己到服务中心
集群注册中心
在分布式系统中,注册中心是最重要的基础部分,为了防止因为注册中心故障导致毁灭性灾难,必须保证注册中心的高可用性,我们可以使用集群的方式。
如下图所示:

这里用3个服务注册中心实例为例子,每个注册中心都和其他两个注册中心进行注册自己,实现两两相互注册。
1.添加配置文件:
application-registry1.yml
#spring配置
spring:
application:
#应用名称
name: service-registry
#服务器配置
server:
#端口
port: 9001
#服务中心发现注册配置
eureka:
instance:
#主机名称
hostname: service-registry1
appname: service-registry
client:
#服务注册中心地址
service-url:
defaultZone: http://service-registry2:9002/eureka,http://service-registry3:9003/eureka
#服务注册中心相互注册一定要显示的设置register-with-eureka 和fetch-registry的值为true,否则会服务不可用
register-with-eureka: true
fetch-registry: true
application-registry2.yml
#spring配置
spring:
application:
#应用名称
name: service-registry
#服务器配置
server:
#端口
port: 9002
#服务中心发现注册配置
eureka:
instance:
#主机名称
hostname: service-registry2
appname: service-registry
client:
#服务注册中心地址
service-url:
defaultZone: http://service-registry1:9001/eureka,http://service-registry3:9003/eureka
#服务注册中心相互注册一定要显示的设置register-with-eureka 和fetch-registry的值为true,否则会服务不可用
register-with-eureka: true
fetch-registry: true
application-registry3.yml
#spring配置
spring:
application:
#应用名称
name: service-registry
#服务器配置
server:
#端口
port: 9003
#服务中心发现注册配置
eureka:
instance:
#主机名称
hostname: service-registry3
client:
#服务注册中心地址
service-url:
defaultZone: http://service-registry1:9001/eureka,http://service-registry2:9002/eureka
#服务注册中心相互注册一定要显示的设置register-with-eureka 和fetch-registry的值为true,否则会服务不可用
register-with-eureka: true
fetch-registry: true
2.修改操作系统的host文件
添加如下配置:
#配置服务注册中心
127.0.0.1 service-registry1
127.0.0.1 service-registry2
127.0.0.1 service-registry3
3.打包
gradle build
4.运行
java -jar service-registry-0.0.1-SNAPSHOT.jar --spring.profiles.active=registry1
java -jar service-registry-0.0.1-SNAPSHOT.jar --spring.profiles.active=registry2
java -jar service-registry-0.0.1-SNAPSHOT.jar --spring.profiles.active=registry3
打开浏览器
输入 http://localhost:9001/
或者 http://localhost:9002/
或者 http://localhost:9003/
都可以看到如下图所示信息

说明服务注册中心已经实现了集群。
项目地址:
https://github.com/lanshiqin/cloud-project.git
欢迎点赞
注意事项
在集群中由于配置不当可能遇到的问题:下图表示服务注册中心不可用的节点

解决方案:
1.服务注册中心集群相互注册一定要开启
register-with-eureka: true
fetch-registry: true
2.服务注册中心集群的spring.application.name一定要一样
3.eureka.client.service-url.defaultZone:不能出现 localhost,一定要使用host指定主机名
正确配置的服务注册中心集群信息如下

有关更多服务注册的文章,可参考其他优秀文章:
http://www.roncoo.com/article/detail/128041
http://chenja.iteye.com/blog/2375104
http://blog.csdn.net/liuchuanhong1/article/details/54895070
http://www.ityouknow.com/springcloud/2017/05/10/springcloud-eureka.html