SpringCloud微服务实战——第三章服务治理
Spring Cloud Eureka
服务治理
是微服务架构中最核心最基本的模块。用于实现各个微服务实例的自动化注册与发现。
服务注册:
在服务治理框架中,都会构建一个注册中心,每个服务单元向注册中心登记自己提供的服务,将主机和端口号、版本号、通信协议等一些附加信息告知注册中心,注册中心按服务名分类组织服务清单。
服务注册中心还需要以心跳的方式去监测清单中的服务是否可用,若不可用,需从服务清单中剔除,达到清楚障碍的目的。
服务发现:
服务的调用通过向服务名发起请求调用实现。调用方向服务注册中心咨询服务,并获取所有服务的实例清单,实现对具体服务实例的访问。
Netflix Eureka
Spring Cloud Eureka 使用Netflix Eureka来实现服务注册于发现。既包含服务端组件也包含客户端组件,且均采用java编写,因此Eureka适用于java实现的分布式系统,或与JVM兼容语言构建的系统。
因为Eureka服务端的服务治理机制提供了完备的RESTful API,也支持非java语言构建的微服务应用纳入Eureka的服务治理体系中去。
Eureka服务端:
服务注册中心,支持高可用配置。依托于强一致性提供良好的服务实例可用性,应用于不同的故障场景。
以集群部署,分片出现故障时,Eureka进入自我保护模式,其他分片提供服务的发现与注册,当故障分片恢复时,集群中的其他分片会把故障分片的状态再次同步回来。
Eureka客户端:
处理服务的注册于发现。
在程序运行时,Eureka客户端向注册中心注册自身提供的服务并周期性地发送心跳来更新它的服务租约。也可以从注册中心查询当前注册的服务信息并把他们缓存到本地周期性地刷新服务状态。
搭建服务注册中心
pom依赖:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
然后在主类上加上注解@EnableEurekaServer
在application.properties上加入:
eureka.client.register-with-eureka:这是向注册中心注册自己,由于本身就是注册中心,所以设置为false
eureka.client.fetch-registry:注册中心就是维护服务实例,不需要检索服务,设置为false
eureka.client.service-url.defaultZone这个实际上就是注册中心的地址。
注册服务提供者
pom文件:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
在主类上添加注解@EnableDiscoveryClient
然后在配置文件中添加:
即可在配置中心中找到服务:
高可用注册中心
之前我们通过下面两个参数让服务中心不注册自己:
eureka server 的高可用实际上就是将自己作为服务向其他服务注册中心注册自己,这样就可以形成一组互相注册的服务注册中心,以实现服务清单的互相同步,达到高可用的效果。
注:配置文件还需要添加上面两个参数,以防止服务中心对自己进行注册。
创建配置文件application-peer1.properties,作为peer1配置中心,且执行peer2配置中心:
创建配置文件application-peer2.properties,作为peer2配置中心,且执行peer1配置中心:
通过命令行分别启动peer1和peer2:
这时服务注册的时候,需要在eureka.client.service-url.defaultZone分别注册peer1与peer2,用逗号分开。
服务发现与消费
通过前文已经完成了服务注册中心与服务提供者了。
我们现在需要构建一个服务消费者,它主要有两个目标:服务发现与消费服务。
服务发现是由eureka的客户端完成,服务消费是由Ribbon完成。
Ribbon是一个基于HTTP和TCP的客户端负载均衡器。
创建一个SpringBoot的基本工程来实现服务消费者,取名为ribbon-consumer。pom如下:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
在主类上加@EnableDiscoveryClient注解,让该应用注册为Eureka客户端,获取发现服务能力。同时在主类中注入RestTemplate的Spring Bean实例。并通过@LoadBalanced注解开启客户端负载均衡。
创建对应的接口控制器:
注:可以看到访问的地址是一个服务名,而不是一个具体的地址,在服务治理框架中,这是非常重要的特性。
在配置文件中配置eureka注册中心的位置。