文章目录
Eureka服务注册与发现(一)
参考:《Srping Cloud与Docker微服务架构实战 周立著》
硬编码的缺陷
在上一节一个简单的微服务中实现的简单的微服务中,实现了两个简单的微服务,电影微服务和用户微服务。但是,在电影微服务中调用用户微服务中,ip+端口实在代码中写死的。这样为后期维护带来很大的不便。由此带来很多问题:
- 修改困难:对于一些应用来说,如果想要修改地址就需要停止服务,修改IP或端口。有的更需要重新打包,很不方便
- 无法动态伸缩:如果需要增加多个实例,那服务的调用者也要同时修改,无法动态伸缩。
为解决这样的问题,便有了服务注册与发现。
服务发现简介
- 各个微服务启动时,将自己的网络信息注册到服务发现组件中,服务发现组件存储这些信息。
- 消费者从服务发现组件查询服务提供者的网络信息,并调用接口
- 微服务与服务发现组件之间通过心跳机制确认服务的存活状态
- 服务地址变更会重新注册到服务发现组件中
服务发现组件有很多,如:Eureka,Consul,Zookeeper。先介绍Eureka,后面会介绍其他。
Eureka简介
- 官方地址:链接
- Github:链接
- Eureka原理:链接
Eureka官方架构图如下:
图中提到的角色有Application Server、Application Client、Eureka Server等。各部分作用如下: - Application Service : 应用系统中的服务提供者
- Application Client : 应用系统中的服务消费者
- Make Remote Call :服务调用
- Eureka Server : 提供服务发现能力,各个服务启动时会像Eureka Server注册服务信息,如果服务的IP、端口等,Eureka会存储这些信息。Eureka Server在一定时间内没有接收到某个微服务的心跳,Eureka Server就会注销整个服务实例。多个Eureka Server之间通过复制的方式,实现数据同步
- Eureka Client : Eureka客户端,用于与Eureka Server交互,如应用客户端需要从Eureka Server获取可用的服务提供者。Eureka Client会缓存服务注册表中的信息,这样即使所有的Eureka Server都宕机,消费者仍然可以正常访问服务提供者。
根据对上述架构图的理解,先实现一个Eureka Server
编写单节点的Eureka Server
- 创建一个Spring Boot项目
micro-eureka-server-master
- 添加依赖
compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-netflix-eureka-server', version: '2.1.2.RELEASE'
- 在启动类添加
@EnableEurekaServer
注解,声明这是一个Eureka Server
@SpringBootApplication
@EnableEurekaServer
public class MicroEurekaServerMasterApplication {
public static void main(String[] args) {
SpringApplication.run(MicroEurekaServerMasterApplication.class, args);
}
}
- 在
application.yml
中添加以下内容:
server:
port: 8761
# 服务注册
eureka:
instance:
hostname: localhost
client:
#是否将自己注册到Eureka Server,默认为true。由于当前就是Eureka Server,所以设成false
registerWithEureka: false
#是否从Eureka Server获取注册信息,默认为true。因为这是单节点的Eureka Server,不需要从其他节点同步Eureka Server节点的数据,所以设成false
fetchRegistry: false
serviceUrl:
# 设置与Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址。默认是http://localhost:9761/eureka。多个服务可以使用,隔开
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
- 启动,后访问
http://localhost:8761/
显示如下:
注册微服务
使用之前创建的用户微服务:micro-user-service
,将其注册到Eureka Server上
- 添加依赖
compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-netflix-eureka-client', version: '2.1.2.RELEASE'
- 修改配置文件
spring:
# 指定注册到Eureka Server上的应用名
application:
name: micro-user-service
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
instance:
#表示将自己的IP注册到Eureka Server上,如果不配置或者值为false,则表示注册微服务所在的操作系统的hostname到Eureka Server
prefer-ip-address: true
- 在启动类上添加
@EnableDiscoveryClient
注解,声明这是一个Eureka Client
@SpringBootApplication
@EnableDiscoveryClient
public class MicroUserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(MicroUserServiceApplication.class, args);
}
}
也可以使用
@EnableEurekaClient
代替@EnableDiscoveryClient
。区别是,如果使用了@EnableDiscoveryClient
注解,同样可以对Zookeeper、Consul等提供支持。@EnableEurekaClient
只默认是Eureka Client。
- 在Eureka Server启动的情况下,启动用户微服务。
- 访问Eureka Server,
http://localhost:8761/
图中的红字部分是说进入了Eureka的自我保护模式,这部分稍后介绍 - 按照之前的流程,也将电影微服务注册到Eureka Server上,启动后再访问:
Eureka服务的高可用(集群)
生产环境中,如果只有单节点的Eureka Server会有很大的风险。虽然Eureka Client会缓存注册表信息,但是如果一旦有服务的端口,IP等发生变更,或者有新服务需要注册到Eureka Server上就会失败,从而导致系统的可用性低。因此部署一个Eureka Server集群是必要的。
- 配置系统的hosts,C:\Windows\System32\drivers\etc目录下。
127.0.0.1 peer1 peer2
- 修改配置文件:
spring:
application:
name: micro-eureka-server
---
spring:
profiles: peer1
server:
port: 8761
eureka:
instance:
hostname: peer1
client:
serviceUrl:
defaultZone: http://peer2:8762/eureka/
---
spring:
profiles: peer2
server:
port: 8762
eureka:
instance:
hostname: peer2
client:
serviceUrl:
defaultZone: http://peer1:8761/eureka/
连接字符(—)将该application.yml分成三段,第二段和第三段分别为spring.properties制定了一个值,该值表示它的所在的那段内容应用在哪个profile里。第一段是对所有的profile都生效。
在IDEA中分别启动两个Eureka Server实例,可配置启动参数,如下图所示:
- Eureka Server1
- Eureka Server2
[外链图片转存失败(img-AhyDbiPd-1563034902911)(picture2/server2.png)]
两者的不同同,在于启动参数不一样。这样就可以分别为实例指定profile - 访问http://peer1:8761会发现
registered-replicas
中有peer2节点。同理访问http://peer2:8762/中有peer1节点
将应用注册到集群上
以用户微服务为例
- 修改配置文件
eureka:
client:
serviceUrl:
#这里如果只配置一个也是可以的,因为集群有复制功能,但是建议配置多个
defaultZone: http://peer1:8761/eureka/,http://peer2:8762/eureka/
instance:
prefer-ip-address: true
- 启动用户微服务
- 访问两个Eureka Server会发现服务已经注册到了Eureka Server,并且两个Server都能看到服务信息。
Github地址
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/13159.html