书接上文,我们需要解决硬编码调用服务接口的问题,解决这个问题我们需要一个强大的服务发现机制,服务消费者使用这个服务发现机制来获取服务提供者的网络信息。当然,服务提供者需要把自己的信息注册到这个服务发现。这样即是服务提供者信息发生变化,也不需要服务消费者修改配置信息。
基本架构
服务提供、服务消费和服务发现组件之间的关系如下图所示
服务发现架构图
当服务提供者网络地址发生变化,会重新注册到服务发现组件。Spring Cloud 提供了多种服务发现组件的支持,比如 Euraka、Consul 和 Zookeeper 等,我们就以 Euraka 为主,毕竟他是 SpringCloud 的嫡系部队。
Eureka 原理
Eureka 架构图
上图的组件较多,但主要的是服务端和客户端,服务端提供服务发现能力,客户端是一个 java 客户端,简化与服务端的操作。服务端和客户端之间通过心跳来维持通信检测。同时提供客户端缓存机制来加速客户端使用。
编写Eureka服务
大概理论一带而过,我们主要先是要使用它。下面就开始编写一个 Eureka 服务
1、 创建 maven 工程,增加 Euraka 依赖
修改 application.properties为 yml 文件,之后都是这样不再赘述
修改服务端口为8050,增加 Euraka 配置
server: port: 8050eureka: client: fetch-registry: false register-with-eureka: false serviceUrl: defaultZone: http://localhost:8050/eureka/
说明:
registerWithEureka: false表示十分把自己注册到 Eureka 服务,默认是 true,这里设置不把自己注册进去
fetchRegistry: false 表示是否从其他 EurakaServer 获取信息,默认是 true,这里是单点的,设置 false
defaultZone: http://localhost:8050/euraka 设置与 Euraka 交互地址,多个地址用逗号分隔
需要在启动类上进行配置
只需要增加一行标注@EnableEurekaServer
即可
启动服务查看信息
看到这个界面就表示 euraka 单机服务正常启动了。
增加服务发现
先把 user 服务提供者注册到 eureka 上,首先在 userpom 上增加 eureka 客户端依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> <version>1.3.5.RELEASE</version> </dependency>
然后在 yml 里面增加 eureka 客户端配置信息
spring: application: name: ms-simple-provider-user eureka: client: service-url: defaultZone: http://localhost:8050/eureka/ instance: prefer-ip-address: true
说明:
spring.application.name表示注册到 eureka 服务的名字
prefer-ip-address 表示把自己的 ip 注册到服务器,否则会是机器名字。
最后修改 user 启动类,增加服务发现的注解,只需要增加@EnableDiscoveryClient
即可;
同样处理下消费服务的注册
服务启动和测试
依次打开 eureka 和 user,movie
eureka 服务高可用
从上面得知,目前是一个单节点的 eureka 服务,有单点故障的问题存在,为了解决这个问题,需要实现高可用部署
按照之前的步骤构建一个新的 eureka 服务
修改新的 euraka 的齐大雷,增加@EnableEurekaServer
标注
之后对两个eureka 服务的 yml进行配置,现在 host 文件添加127.0.0.1 eureka1,eureka2
来使得可以使用这两个域名进行配置
首先对之前第一个 yml 修改为
server: port: 8050spring: application: name: eureka-server eureka: instance: hostname: eureka1 client: #fetch-registry: false # 表示是否从Eureka Server获取注册信息,默认为true.因为这是一个单点的Eureka Server,不需要同步其他的Eureka Server节点的数据,这里设置为false #register-with-eureka: false # 表示是否将自己注册到Eureka Server,默认为true.由于当前应用就是Eureka Server,故而设置为false. service-url: # 设置与Eureka Server的地址,查询服务和注册服务都需要依赖这个地址.默认是http://localhost:8050/eureka/;多个地址可使用','风格. defaultZone: http://eureka2:8051/eureka/
第二个 yml 修改为
server: port: 8051spring: application: name: eureka-server eureka: instance: hostname: eureka2 client: #fetch-registry: false # 表示是否从Eureka Server获取注册信息,默认为true.因为这是一个单点的Eureka Server,不需要同步其他的Eureka Server节点的数据,这里设置为false #register-with-eureka: false # 表示是否将自己注册到Eureka Server,默认为true.由于当前应用就是Eureka Server,故而设置为false. service-url: # 设置与Eureka Server的地址,查询服务和注册服务都需要依赖这个地址.默认是http://localhost:8050/eureka/;多个地址可使用','风格. defaultZone: http://eureka1:8050/eureka/
启动这两个 eureka 服务,分别浏览 http://eureka1.8050 和 http://eureka2:8051 可以看到各自的registered-replicas
应用注册到集群上
回到 user 和 movie 服务模块,修改他们的 defaultZone 为:
eureka: client: service-url: defaultZone: http://eureka1:8050/eureka/,http://eureka2:8051/eureka/
分别启动他们,可以在 eureka 集群看到
eureka 服务验证
我们的注册服务一直是可以匿名的形式,我们需要增加他的安全性,设置一些账号密码来加强
首先在 eureka1和 eureka2的 pom 中增加依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
在各自的 yml 中配置账号密码
security: basic: enabled: true user: name: abc password: 123
打开 eureka 服务就会出现
输入账号和密码可使用
其他微服务需要配置用户名和密码方可注册使用,如下代码示例
eureka: client: service-url: defaultZone: http://abc:123@eureka1:8050/eureka/,http://abc:123@eureka2:8051/eureka/
作者:breezedancer
链接:https://www.jianshu.com/p/dd91b7dd0df7