springcloudeureka服务端和客户端(cloud微服务架构服务注册与发现Eureka)
springcloudeureka服务端和客户端(cloud微服务架构服务注册与发现Eureka)为了解决这些问题,第一步,要将服务现在每天的调用量,响应时间,都统计出来,作为容量规划的参考指标。(3) 接着,服务的调用量越来越大,服务的容量问题就暴露出来,这个服务需要多少机器支撑?什么时候该加机器?并通过在消费方获取服务提供方地址列表,实现软负载均衡和Failover,降低对F5硬件负载均衡器的依赖,也能减少部分成本。(2) 当进一步发展,服务间依赖关系变得错踪复杂,甚至分不清哪个应用要在哪个应用之前启动,架构师都不能完整的描述应用的架构关系。这时,需要自动画出应用间的依赖关系图,以帮助架构师理清理关系。
前言对于微服务架构,相信大家都不陌生。随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,在不断应对日益增长的业务量而演化出来的微服务。当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。垂直应用架构当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率。服务注册与发现是服务治理的一个非常必要环节,这里可能又引出一个问题,为什么需要服务治理。
在大规模服务化之前,应用可能只是通过RMI或Hessian等工具,简单的暴露和引用远程服务,通过配置服务的URL地址进行调用,通过F5等硬件进行负载均衡。
(1) 当服务越来越多时,服务URL配置管理变得非常困难,F5硬件负载均衡器的单点压力也越来越大。
此时需要一个服务注册中心,动态的注册和发现服务,使服务的位置透明。
并通过在消费方获取服务提供方地址列表,实现软负载均衡和Failover,降低对F5硬件负载均衡器的依赖,也能减少部分成本。
(2) 当进一步发展,服务间依赖关系变得错踪复杂,甚至分不清哪个应用要在哪个应用之前启动,架构师都不能完整的描述应用的架构关系。
这时,需要自动画出应用间的依赖关系图,以帮助架构师理清理关系。
(3) 接着,服务的调用量越来越大,服务的容量问题就暴露出来,这个服务需要多少机器支撑?什么时候该加机器?
为了解决这些问题,第一步,要将服务现在每天的调用量,响应时间,都统计出来,作为容量规划的参考指标。
Spring cloud是服务治理的一个框架,里面包含很多子项目,其中包含config,Netflix,consul,OpenFeign 等等,其中在微服务架构用的最多应该是Netflix的服务发现(Eureka),断路器(Hystrix),智能路由(Zuul),负载均衡(Ribbon)等
Eureka Server(注册中心服务端)首先我们新建一个注册中心服务,新建一个maven的parent应用,pom引入如下
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
我们用较新的 Spring boot 2.1.9.RELEASE 和Spring cloud Greenwich.SR3
新建Eureka-server模块,pom引入
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
配置文件application.yml 如下:
server: port: 8761 eureka: instance: hostname: localhost client: registerWithEureka: false fetchRegistry: false serviceUrl: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
Eureka启动注册中心,只需要EnableEurekaServer注解就可以标注为是Eureka Server,启动类如下:
@SpringBootApplication @EnableEurekaServer public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class args); } }
完成上面几步,注册中心服务就已经做好了,启动之后,访问
http://localhost:8761/ 会出现如下页面
你的注册中心就已经起来了。
关于注册中心的application.yml 的配置有几点需要说明:
eureka.instance.hostname
这是当前eureka server 主机的hostname,当然,很多情况下,我们更希望用ip代替hostname,可以在application.yml文件中将eureka.instance.preferIpAddress 设置为true,这样就可以使用ip作为hostname了。
eureka.client下面的 registerWithEureka,fetchRegistry,defaultZone
由于Eureka server 是没有后端服务区存储它的状态,但是Eureka server也必须得有地方记录Eureka server 的状态以保证它的注册信息是最新的,Eureka server也发必须发心跳检查给注册中心。但Eureka server本身也是注册中心,这是怎么回事呢?
在默认情况下,每个Eureka server 既是注册中心的server 也是client。所以它需要serviceUrl来发送它的注册信息。如果没有提供这个url,日志会一直报注册连接失败的信息。
在单个eureka-server 的情况下,它既是 server,又是client,server和client的cache互相组合,互相发心跳。在只有个eureka-server的情况下,server作为client是没有意义的,所以我们的把client端属性去掉,所以把 registerWithEureka 和 fetchRegistry 设置为false以关掉它作为eureka client 的行为。
Eureka client(注册中心客户端)新建Eureka client模块,在pom引入
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
新建启动类,在新版本中其实并不需要加上EnableEurekaClient注解,出于习惯还是加上
pringBootApplication @EnableEurekaClient public class EurekaClientApplication { public static void main(String[] args) { SpringApplication.run(EurekaClientApplication.class args); } }
application.yml 文件配置
server: port: 8764 spring: application: name: eureka-client eureka: client: serviceUrl: defaultZone: http://eureka-server1:8761/eureka/
完成上面三步,eureka 客户端建好,启动之后会默认把数据发送到注册中心,我们可看到
注意:
spring.application.name 必须配置,在注册中心里是以 spring.application.name 虚拟host,端口来区分不同的环境
eureka 客户端注册
当一个客户端注册到注册中心时,会把该应用的一些元数据,如ip,端口,健康检查url,home page等等一些发送到注册。注册中心通过心跳接收消息来确定每个应用是否还活着,如果超过配置的时间没有心跳,则将该应用从注册中心移出。
eureka 健康检查
eureka client健康检查的 status page 和 health indicators 分别是 /info 和 /health ,这是eureka 客户端启动时候默认帮我们配置好的,如果需要改变这个地址,或者你的应用的上下文不是默认的,则需要改这些配置型
eureka: instance: statusPageUrlPath: ${server.servletPath}/info healthCheckUrlPath: ${server.servletPath}/health
在默认情况下,客户端成功启动注册到注册中心,注册中心会宣布改实例是可用的,然后通过心跳该实例的运行状态。同时,客户也会缓存一份注册中心的数据到自己的实例中。如果不想客户端做心跳的话,可以用 eureka.client.healthcheck.enabled=true 设置,心跳的时间周期默认是 30s,也可以修改心跳周期,通eureka.instance.leaseRenewalIntervalInSeconds,
DiscoveryClient
在 eureka client 中还可以使用DiscoveryClient 从注册中心操作数据,例如
@Autowired private DiscoveryClient discoveryClient; public String serviceUrl() { List<ServiceInstance> list = discoveryClient.getInstances("STORES"); if (list != null && list.size() > 0 ) { return list.get(0).getUri(); } return null; } Eureka 高可用服务注册中心
在前面的例子中,单个eureka-server存在着单点行为,显然不符合微服务架构中的高可用原则。eureka可以做到更加的弹性伸缩高可用,通过运行多个 eureka-server实例,并它们互相注册。这是eureka 默认的行为,eureka并不建议单个server使用,除非是测试。我们只需要添加一个有效的serviceUrl就可以做到高可用。
双 Eureka server
在本地测试双Eureka Server,我们需要新建两份配置文件(在生产真实机器情况下并不需要这样做)
application-peer1.yml
server: port: 8761 eureka: instance: hostname: eureka-server1 client: serviceUrl: defaultZone: http://eureka-server2:8762/eureka/
application-peer2.yml
server: port: 8762 eureka: instance: hostname: eureka-server2 client: serviceUrl: defaultZone: http://eureka-server1:8761/eureka/
分别以这两份配置文件启动,则双注册中心建好。
多个 Eureka server
一般情况下我们会建三个以上的注册中心做高可用,各个注册中心互联连接,它们之间互相同步注册中心的信息,同样的道理,我们需要在本地测试新建三个测试yml文件。
application-peer1.yml
server: port: 8761 eureka: instance: hostname: eureka-server1 client: serviceUrl: defaultZone: http://eureka-server2:8762/eureka/https://eureka-server1:8761/eureka/ http://eureka-server2:8762/eureka/ http://eureka-server3:8763/eureka/
application-peer2.yml
server: port: 8762 eureka: instance: hostname: eureka-server2 client: serviceUrl: defaultZone: http://eureka-server2:8762/eureka/https://eureka-server1:8761/eureka/ http://eureka-server2:8762/eureka/ http://eureka-server3:8763/eureka/
application-peer3.yml
server: port: 8762 eureka: instance: hostname: eureka-server2 client: serviceUrl: defaultZone: http://eureka-server2:8762/eureka/https://eureka-server1:8761/eureka/ http://eureka-server2:8762/eureka/ http://eureka-server3:8763/eureka/
分别以这三份配置文件启动,则三注册中心建好。