注册与发现(Eureka)
注册与发现初实践,注册中心采用SpringCloud全家桶中的Eureka,并配合RestTemplate从Euraka调用微服务。
在前置章节的电影票-用户服务组的基础上升级,摒弃硬编码微服务地址的方案,使用eureka实现微服务的动态发现与调用。
创建注册中心
- 引入Eureka Server依赖
新建一个SpringCloud项目,并预装Eureka Server工具包,当然也可以手动在pom文件中引入,记得一定要是带starter的(基于本文采用的2021.0.6版本的spring-cloud):
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
- 在启动类上添加
@EnableEurekaServer
,声明是Eureka服务器 - 在配置文件中配置Eureka信息
- server.port:配置服务器端口
- eureka.instance:实例配置(单体可以不配)
- appname:实例名称
- app-group-name:实例组名,通常为同一个服务下的不同实例所共享
- hostname:域名,不设置时默认为主机名
- prefer-ip-address:展示ip地址
- euraka.client:客户端配置
- service-url:注册中心的服务地址
- fetch-registry:获取注册表,作为注册中心无需开启
- register-with-eureka:是否注册,不做集群可以不注册
server:
port: 8848
eureka:
instance:
appname: eureka-server
app-group-name: example-1
hostname: localhost
prefer-ip-address: true
client:
service-url:
defaultZone: http://localhost:8848/eureka
fetch-registry: false
register-with-eureka: true
一个简单的Eureka注册中心到这里就完成了,接着我们把用户微服务注册道 Eureka中
微服务注册
- 引入Eureka Client依赖,记得要带starter的:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
- 在启动类上添加
@EnableEurekaClient
,声明是Eureka客户端 - 配置文件中配置客户端信息:
- spring应用名一定要配,它将作为登记在Eureka中的服务名,到时候是根据服务名解析网络地址
- 实例名建议配,一个注册多个实例的时候方便区分
- 其它前头提过了不再赘述
spring:
application:
name: user-service
eureka:
client:
register-with-eureka: true
service-url:
defaultZone: http://localhost:8848/eureka
instance:
appname: user-service-1 # 不定义的话默认为应用名application.name
prefer-ip-address: true
单单作为Eureka的服务提供者到此也完成,接着升级服务消费者ticket
调用微服务
- 和提供者一样,引入Eureka Client依赖
- eureka相关的配置类似,不再复述;此外把待调用的user服务的信息也写进配置文件吧
api:
user-service:
name: user-service # 服务名
url: http://127:0:0:1:8081/user/ # 之前章节用的直接调用地址
- 重点在于服务发现和调用
获取服务列表
一个服务注册到Eureka中后,Eureka会在自己的注册表中,按服务的名称与服务的真实域名+端口做一一映射,即user-service运行在http://localhost:8081
上,登记的是服务名user-service
,RestTemplate拿到Eureka的服务注册表后,调用user-service时,请求的是http://user-service
,此时会根据注册表把实际的请求路径中user-service
解析为查到的实际的localhost:8080
,相当于做了一个代理;如果这个服务并未注册或者RestTemplate没有拿到注册表,就只能原路请求,自然请求不到。
获取注册表很简单,在我们的ResTemplate的Bean上加个@LoadBalanced
注解即可:
@Bean
@LoadBalanced
public RestTemplate rest() {
return new RestTemplate();
}
@LoadBalanced
加了之后,即做到了服务发现又做到了负载均衡
调用远程服务
此时调整我们UserApi中的baseUrl即可:
//@Value("${api.user-service.url}")
@Value("http://${api.user-service.name}/user/")
private String baseUrl;
到这一步,作为消费者的ticket也就完成了,接下来运行三个项目
成果
浏览器访问Eureka服务器的地址http://localhost:8848
此时可以看到包括Eureka在内(之前让Eureka把自己也注册了),总共有3个健康的服务实例:
此时请求之前的http://localhost:8080/ticket/canibuy?price=200&id=3接口
{
"code": 200,
"msg": "余额充足",
"data": {
"id": 3,
"username": "user3",
"name": "用户3",
"age": 23,
"balance": 300.0
}
}
成功拿到结果!我们通过Eureka+Restemplate成功的实现了微服务的动态发现和调用,至此我们已经正式入门微服务架构。
入门章节采用了Restempl ate+eureka,是因为它们足够经典。在本系列后面,将主要采用openFeign+nacos构建微服务。