SpringCloud学习笔记(3)—— 服务治理:Spring Cloud Eureka
Spring Cloud Eureka 是Spring Cloud Netflix微服务套件中的一部分,它基于Netflix Eureka做了二次封装,主要负责完成微服务架构中的服务治理功能。
我们将学习下面的这几个核心内容
- 构建服务注册中心
- 服务注册与服务发现
- Eureka 的基础架构
- Eureka 的服务治理机制
- Eureka 的配置
一、服务治理
服务治理可以说是微服务架构中最为核心和基础的模块, 它主要用来实现各个微服务实例的自动化注册和发现。
1.服务注册
在服务治理框架中,通常都会构建一个注册中心,每个服务单元向注册中心登记自己提供的服务,将主机与端口号、版本号、通信协议等一些附加信息告知注册中心,注册中心按照服务名分类组织服务清单。另外,服务注册中心还需要以心跳的方式去监测清单中的服务是否可用,若不可用需要从服务清单中剔除,达到排除故障服务的效果。
服务名 | 位置 |
---|---|
服务A | 192.168.0.100:8000、192.168.0.101:8000 |
服务B | 192.168.0.100:9000、192.168.0.101:9000、192.168.0.102:9000 |
2.服务发现
云端负载均衡,一个基于 REST 的服务,用于定位服务,以实现云端的负载均衡和中间层服务器的故障转移。
3、搭建服务注册中心
创建一个基础的Spring Boot 工程,命名为eureka-server,并在pom中引入必要的依赖内容,代码如下:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.1.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.gildata</groupId> <artifactId>eureka-server</artifactId> <version>0.0.1-SNAPSHOT</version> <name>eureka-server</name> <description>eureka-server project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <!-- 使用dependencyManagement进行版本管理 --> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.RC1</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <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> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> <version>2.0.2.RELEASE</version> </dependency> </dependencies>
通过@EnableEurekaServer注解启动一个服务注册中心提供给其他应用进行对话。比如下面的例子:
@EnableEurekaServer @SpringBootApplication public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args); } }
在默认设置下,该服务注册中心也会将自己作为客户端来尝试注册它自己,所以我们需要禁用它的客户端注册行为
spring.application.name=spring-cloud-eureka-server server.port=8761 # 由于该应用中心为注册中心,所有设置为false,代表不向注册中心注册自己 eureka.client.register-with-eureka=false # 由于注册中心的职责就是维护服务实例,它并不需要去检索服务,所以也设置为false eureka.client.fetch-registry=false eureka.instance.hostname=localhost eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka/
启动端口访问如下:
4、注册服务提供者
完成了服务注册中心的搭建以后,接下来我们尝试将一个既有的Spring Boot应用加入Eureka的服务治理体系中去。
① 新建maven项目
②添加pom依赖
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.spring 4000 framework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> <version>2.0.2.RELEASE</version> </dependency> </dependencies>
③ 写启动类
@EnableDiscoveryClient @SpringBootApplication public class SpringbootDemoApplication { public static void main(String[] args) { SpringApplication.run(SpringbootDemoApplication.class, args); } }
④ 添加controller
/** * Created by liaock on 2018/12/17. */ @RestController public class HelloController { @RequestMapping("/hello") public String index(){ return "Hello World !"; } }
⑤修改配置文件
spring.application.name=hello-service eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
通过spring.application.name属性为服务命名,通过eureka.client.service-url.defaultZone 属性来指定服务注册中心的地址,地址和注册中心设置的地址一致。
启动服务,访问Eureka的信息面板,即可看到服务的注册信息。
5、高可用注册中心
在微服务架构这样的分布式环境中,需要充分考虑发生故障的情况,所以在生产环境中必须对各个组件进行高可用部署。
Eureka Server 的设计一开始就考虑了高可用问题,在Eureka的服务治理中,所有节点既是服务提供方,也是服务消费方,服务注册中心也一样。
Eureka Server 的高可用实际上就是将自己作为服务向其他服务注册中心注册自己,这样就可以形成一组互相注册的服务注册中心,以实现服务清单的相互同步,达到高可用的效果。
下面我们来搭建一个高可用服务注册中心集群,构建一个双节点的服务注册中心集群:
- 创建application-peer1.properties,作为peer1 服务中心的配置,并将serviceUrl指向peer2:
spring.application.name=eureka-server server.port=1111 eureka.instance.hostname=peer1 eureka.client.service-url.defaultZone=http://peer2:1112/eureka/
- 创建 application-peer2.properties,作为peer2 服务中心的配置,并将serviceUrl指向peer1:
spring.application.name=eureka-server server.port=1112 eureka.instance.hostname=peer2 eureka.client.service-url.defaultZone=http://peer1:1111/eureka/
- 在/etc/hosts 文件中添加对peer1 和 peer2的转换,让上面配置的host形式的serviceUrl 能在本地正确访问到
- 通过spring.profiles.active 属性来分别启动peer1 和 peer2
java -jar eureka-server-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer1 java -jar eureka-server-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer2
- 在设置了多节点的服务注册中心之后,服务提供方还需要做一些简单的配置才能将服务注册到Eureka Server 集群中
spring.application.name=hello-service eureka.client.service-url.defaultZone=http://peer1:1111/eureka/,http://peer2:1112/eureka/
下面我们自动该服务,可以观察到 hello-service 服务同时被注册到了peer1和peer2上。若此时断开peer1,由于服务同时也注册到了pee2,因此在peer2上的其他服务依然可以访问hello-service,从而实现服务注册中心的高可用。
6、服务发现与消费
我们已经实现了服务注册中心和服务提供者,下面我们来构建一个服务消费者,它主要完成两个目标,发现服务以及消费服务。其中 服务发现任务是由Eureka的客户端完成,而服务消费的任务是由Ribbon完成,Ribbon是一个基于HTTP和TCP的客户端负载均衡器,它可以通过在客户端中配置的ribbonServerList服务端列表去轮询访问以达到均衡负载的作用。
①为了试验Ribbon的客户端负载均衡功能,我们通过java -jar命令方式来启动两个不同端口的 hello-service
②创建一个Spring Boot的基础工程来实现服务消费者,取名为ribbon-consumer,并添加如下依赖
<dependencies> <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> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> <version>2.0.2.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-ribbon --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> <version>2.0.2.RELEASE</version> </dependency> </dependencies>
③创建主类,通过@EnableDiscoveryClient注解让该应用注册为Eureka客户端应用,以获得服务发现能力。通过@LoadBalanced注解开启客户端负载均衡。
@EnableDiscoveryClient @SpringBootApplication public class RibbonConsumerApplication { @LoadBalanced @Bean RestTemplate restTemplate(){ return new RestTemplate(); } public static void main(String[] args) { SpringApplication.run(RibbonConsumerApplication.class, args); } }
④创建 ConsumerController 类并实现 /ribbon-consumer接口,通过上面创建的RestTemplate来实现对 HELLO-SERVICE服务提供的/hello 接口进行调用,可以看到这里访问的地址是服务名 HELLO-SERVICE 而不是具体的地址
/** * Created by liaock on 2018/12/19. */ @RestController public class ConsumerController { @Autowired RestTemplate restTemplate; @RequestMapping(value="/ribbon-consumer",method = RequestMethod.GET) public String helloConsumer(){ return restTemplate.getForEntity("http://HELLO-SERVICE/hello",String.class).getBody(); } }
⑤ 修改配置文件
spring.application.name=ribbon-consumer server.port=9000 eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
启动ribbon-consumer 应用后,在Eureka面板中可以看到我们实现的RIBBON-CONSUMER 服务
此时,访问http://localhost:9000/ribbon-consumer,成功返回了“Hello World !”
- SpringCloud Finchley 实战入门(基于springBoot 2.0.3)【二 服务治理 Eureka】
- Spring Cloud Eureka 服务治理
- springcloud微服务三:Eureka服务治理之注册服务提供者及服务的发现和消费
- 干货分享微服务spring-cloud(3.服务治理eureka)
- SpringCloud服务治理-搭建一个实用的Eureka Server
- 服务治理:Spring Cloud Eureka
- 1、SpringCloud Eureka 服务治理
- Spring Cloud Eureka服务治理
- Spring Cloud Eureka 服务治理(一)
- (三)服务治理:Spring Cloud Eureka --笔记
- Spring Cloud学习笔记1——服务治理(Eureka)
- spring-cloud中eureka进行服务治理
- 微服务之SpringCloud实战(二):SpringCloud Eureka服务治理
- Spring Cloud Eureka 服务治理
- Spring Cloud初探——服务治理Spring Cloud Eureka
- SpringCloud微服务知识整理三:服务治理 Spring Cloud Eureka
- springcloud微服务二:Eureka服务治理之服务注册中心
- 服务治理 Spring Cloud Eureka
- Spring Cloud Eureka服务治理
- Spring Cloud Learning | 第一篇:服务治理(Eureka)