SpringCloud文章系列
- SpringCloud
- 【当前文章】SpringCloud-注册中心
- SpringCloud-配置中心
- SpringCloud-链路跟踪
- SpringCloud-消息总线
- SpringCloud-API网关
- SpringCloud-异步消息
- SpringCloud-同步调用
- SpringCloud-断路降级
- SpringCloud-监控管理
- SpringCloud-番外篇-临时任务
- SpringCloud-番外篇-文档生成
- SpringCloud-番外篇-源码解析
接入说明
- 目前采用最新的1.xRelease版本:1.5.15.RELEASE
- SpringCloud项目可以在start.spring.io下载,不过更方便的应该是通过idea新建项目,建立Spring Initializr项目
- 我一般习惯将具体实现服务用具体的服务名,而公共组件用service-xxx来命名,当然还有一些比较固定名字的公共组件
Eureka
1. 新建项目
新建artifactId为eureka-service的服务
2. 导入依赖
依赖说明
- actuator用于暴露监控的接口
- eureka-server是Eureka服务器的依赖
1 | <dependency> |
3. 编写启动类
打开EurekaServiceApplication,在class上加入@EnableEurekaServer注解
4. 修改配置
1 | server.port=8761 |
注册中心默认端口号8761
eureka.client.register-with-eureka代表开启自我注册,单机关闭
eureka.client.fetch-registry用于开启同步其他Eureka数据,单机关闭
5. 启动main
6. 验证
访问 http://localhost:8761/ 可以看到单台的”System Status”、”DS Replicas”、”Instances currently registered”、”General Info”、”Instance Info”
Instance Info的status为UP,说明启动成功
Eureka集群
作为注册中心,是非常关键的服务,几乎所有服务的启动与调用都依赖于注册中心,需要保证注册中心高可用,所以Eureka一般配置为集群模式
如果不清楚在同一个工程中如何启动2种不同配置的服务器,请观看文章:idea中同项目不同端口与配置启动多个步骤
1. 修改配置文件
配置2个server,server1使用端口8761,server2使用端口8762
server11
2
3
4
5
6
7server.port=8761
spring.application.name=eureka-service
# private
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true
eureka.client.service-url.defaultZone=http://localhost:8762/eureka
server21
2
3
4
5
6
7server.port=8762
spring.application.name=eureka-service
# private
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true
eureka.client.service-url.defaultZone=http://localhost:8761/eureka
如果超过2台的集群怎么配置?
- defaultZone可以配置多个用”,”隔开,其实链接其中一个就能整个集群链接同步,不过一般担心某一台出现问题,还是配置多台
2. 启动
启动server1
启动server2
3. 验证
访问 http://localhost:8761/ 看到”Instances currently registered”中EUREKA-SERVICE的UP是2个
http://localhost:8762/ 看到”Instances currently registered”中EUREKA-SERVICE的UP是2个
客户端使用
1. 添加依赖
1 | <dependency> |
2. 开启注解
启动类+@EnableEurekaClient
3. 修改配置
eureka.client.serviceUrl.defaultZone的默认值是 http://localhost:8761
基于以上集群可以配置如下
1 | spring.application.name=xxx-service |
注意事项
- /eureka这个必须加上,否则是注册不上去的
- spring.application.name是必须设置的,用于标识注册中心中服务的名称
疑问
为什么客户端也需要配置2台,配置1台可以么?
可以配置一台。如果之前已经注册过server1了,会同步给server2,即使server1挂了,注册上的服务依然可以通过server2路由到
但是如果server1挂了,则后续只指定server1的client就无法启动成功,无法注册到Eureka上,所以为了启动注册的高可用需要配置多台
- 优化:后续公共配置可以抽离到配置中心中,避免修改不同步问题,后续配置中心章节会讲
注意事项
- spring.application.name 不能包含下划线,因为在eureka中java.net.URI不能区分下划线,否则在进行服务调用的时候报错(host name may not be null);
- 注意eureka的Maven坐标发布过2种命名方式,其中一种已经废弃,使用最新版的命名可以保证后续更新(明确了客户端与服务器依赖,与公司名称)
- 历史上的废弃版本:spring-cloud-starter-eureka与spring-cloud-starter-eureka-server
- 最新版本命名:spring-cloud-starter-netflix-eureka-client与spring-cloud-starter-netflix-eureka-server
SpringCloud注册中心抽象层
目前用到的注解都是@EnableEurekaClient,@EnableEurekaServer,而且配置都是eureka开头的,耦合了Eureka
其实为了方便替换注册中心实现,或者规范配置中心,SpringCloud针对多种实现提供一个抽象层,提供了通用的注解与配置,Eureka也是其中的一种实现而已
抽象层配置
主要防止客户端的强依赖,所以只提供了客户端的注解,服务端直接就是具体的注册中心实现
客户端注解:@EnableDiscoveryClient
客户端配置:略…
其他注册中心
目前业界有Consul、Zookeeper、etcd等实现方案,这里列举常用的2种
快速接入
Consul
下载consul启动,server.port=8503,spring.cloud.consul.host=127.0.0.1,spring.cloud.consul.port=8500 #设置不需要注册到 consul 中spring.cloud.consul.discovery.register=false 消费端可以不注册
服务器:spring-boot-starter-actuator + spring-cloud-starter-consul-discovery + @EnableDiscoveryClient spring.cloud.consul.host spring.cloud.consul.port=8500 spring.cloud.consul.discovery.serviceName=service-producer
Zookeeper
dependencys:spring-cloud-zookeeper-dependencies + spring-cloud-zookeeper-discovery + Apache Curator + Zookeeper Java Client + @EnableDiscoveryClient:自动连接 http://localhost:2181 的注册中心(zookeeper.connectString)
服务器:zookeeper集群