SpringCloud框架Eureka服务发现与高可用

1.Spring Cloud 简介

Spring Cloud是在Spring Boot的基础上构建的,用于简化分布式系统构建的工具集,为开发人员提供快速建立分布式系统中的一些常见的模式。例如:配置管理(configuration management),服务发现(servicediscovery),断路器(circuit breakers),智能路由( intelligent routing),微代理(micro-proxy),控制总线(control bus),一次性令牌( one-time tokens),全局锁(global locks),领导选举(leadership election),分布式会话(distributed sessions),集群状态(cluster state)。

Spring Cloud 包含了多个子项目:

例如:Spring Cloud Config、Spring Cloud Netflix等Talk is cheep, show me the code.下面我们将以代码与讲解结合的方式,为大家讲解Spring Cloud中的各种组件

2.示例规划

 

 

 

3.创建父项目

在进入主题之前,我们首先创建一个父项目(spring-cloud-microservice-study),这样可以对项目中的Maven依赖进行统一的管理。

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="ht
 3 tp://www.w3.org/2001/XMLSchema-instance"
 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://m
 5 aven.apache.org/xsd/maven-4.0.0.xsd">
 6 <modelVersion>4.0.0</modelVersion>
 7     <groupId>com.itmuch.cloud</groupId>
 8     <artifactId>spring-cloud-microservice-study</artifactId>
 9     <version>0.0.1-SNAPSHOT</version>
10     <packaging>pom</packaging>
11 <modules>
12     <module>microservice-discovery-eureka</module>
13     <module>microservice-provider-user</module>
14     <module>microservice-consumer-movie-ribbon</module>
15     <module>microservice-consumer-movie-feign</module>
16     <module>microservice-consumer-movie-ribbon-with-hystrix</module>
17     <module>microservice-consumer-movie-feign-with-hystrix</module>
18     <module>microservice-hystrix-dashboard</module>
19     <module>microservice-consumer-movie-feign-with-hystrix-stream</module>
20     <module>microservice-hystrix-turbine</module>
21     <module>microservice-config-server</module>
22     <module>microservice-config-client</module>
23     <module>microservice-config-server-eureka</module>
24     <module>microservice-config-client-eureka</module>
25     <module>microservice-api-gateway</module>
26 </modules>
27 <!-- 使用最新的spring-boot版本 -->
28 <parent>
29     <groupId>org.springframework.boot</groupId>
30     <artifactId>spring-boot-starter-parent</artifactId>
31     <version>1.4.0.RELEASE</version>
32 </parent>
33 <properties>
34     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
35     <java.version>1.8</java.version>
36 </properties>
37 <dependencyManagement>
38     <dependencies>
39         <dependency>
40             <groupId>org.springframework.cloud</groupId>
41             <artifactId>spring-cloud-dependencies</artifactId>
42             <version>Brixton.SR5</version>
43             <type>pom</type>
44             <scope>import</scope>
45         </dependency>
46     </dependencies>
47 </dependencyManagement>
48 <build>
49 <plugins>
50     <plugin>
51         <groupId>org.springframework.boot</groupId>
52         <artifactId>spring-boot-maven-plugin</artifactId>
53     </plugin>
54 </plugins>
55 </build>
56 </project>

 

 

4.服务发现

在微服务架构中,服务发现(Service Discovery)是关键原则之一。手动配置每个客户端或某种形式的约定是很难做的,并且很脆弱。Spring Cloud提供了多种服务发现的实现方式,例如:Eureka、Consul、Zookeeper。Spring Cloud支持得最好的是Eureka,其次是Consul,最次是Zookeeper。

1.Eureka

在生产环境下,我们往往会为每个应用配置一个host,使用host而非IP进行访问。为了更加贴近生产环境,以及后文Docker章节的讲解,我们首先配置一下Host

1 127.0.0.1 discovery

创建一个Maven工程(microservice-discovery-eureka),并在pom.xml中加入如下内容:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="ht
 3 tp://www.w3.org/2001/XMLSchema-instance"
 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://m
 5 aven.apache.org/xsd/maven-4.0.0.xsd">
 6 <modelVersion>4.0.0</modelVersion>
 7 <artifactId>microservice-discovery-eureka</artifactId>
 8 <packaging>jar</packaging>
 9 <parent>
10     <groupId>com.itmuch.cloud</groupId>
11     <artifactId>spring-cloud-microservice-study</artifactId>
12     <version>0.0.1-SNAPSHOT</version>
13 </parent>
14 <dependencies>
15     <dependency>
16         <groupId>org.springframework.cloud</groupId>
17         <artifactId>spring-cloud-starter-eureka-server</artifactId>
18     </dependency>
19 </dependencies>
20 </project>


编写Spring Boot启动程序:通过@EnableEurekaServer申明一个注册中心:

 1 /**
 2 * 使用Eureka做服务发现。
 3 * @author eacdy
 4 */
 5 @SpringBootApplication
 6 @EnableEurekaServer
 7 public class EurekaApplication {
 8     public static void main(String[] args) {
 9         SpringApplication.run(EurekaApplication.class, args);
10     }
11 }


在默认情况下,Eureka会将自己也作为客户端尝试注册,所以在单机模式下,我们需要禁止该行为,只需要在application.yml中如下配置:

 1 server:
 2     port: 8761 # 指定该Eureka实例的端口
 3 eureka:
 4     instance:
 5         hostname: discovery # 指定该Eureka实例的主机名
 6 client:
 7     registerWithEureka: false
 8     fetchRegistry: false
 9     serviceUrl:
10         defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
11 # 参考文档:http://projects.spring.io/spring-cloud/docs/1.0.3/spring-cloud.html#_standalone_mode
12 # 参考文档:http://my.oschina.net/buwei/blog/618756

 

启动工程后,访问:http://discovery:8761/ ,如下图。我们会发现此时还没有
服务注册到Eureka上面。
在这里插入图片描述

2.Eureka的高可用

按照前文对Eureka的讲解,我们即可构建出一个简单的注册中心。但此时的Eureka是单点的,不适合于生产环境,那么如何实现Eureka的高可用呢?

添加主机名:

1 127.0.0.1 peer1 peer2

修改application.yml

 1 ---
 2 spring:
 3     profiles: peer1 # 指定profile=peer1
 4 server:
 5     port: 8761
 6 eureka:
 7     instance:
 8         hostname: peer1 # 指定当profile=peer1时,主机名
 9 client:
10     serviceUrl:
11         defaultZone: http://peer2:8762/eureka/ # 将自己注册到peer2这个Eureka上面去
12 ---
13 spring:
14     profiles: peer2
15 server:
16     port: 8762
17 eureka:
18     instance:
19         hostname: peer2
20 client:
21     serviceUrl:
22         defaultZone: http://peer1:8761/eureka/

分别启动两个Eureka应用:

1 java -jar microservice-discovery-eureka-0.0.1-SNAPSHOT.jar --spr
2 ing.profiles.active=peer1
3 java -jar microservice-discovery-eureka-0.0.1-SNAPSHOT.jar --spr
4 ing.profiles.active=peer2

访问 http://peer1:8761 ,我们会发现 registered-replicas 中已经有 peer2 节点了,同样地,访问 http://peer2:8762 ,也能发现其中的 registered-replicas 有 peer1 节点,
如下图:

在这里插入图片描述

我们尝试将 peer2 节点关闭,然后访问http://peer1:8761,会发现此
peer2会被添加到unavaliable-replicas 一栏中。

该示例中的 hostname 并非必须的,如果不配置,默认将会使用IP进行查找。

3.将服务注册到高可用的Eureka

如果注册中心是高可用的,那么各个微服务配置只需要将 defaultZone 改为如下即可:

1 eureka:
2     client:
3         serviceUrl:
4             defaultZone: http://peer1:8761/eureka/,http://peer2:8762/eureka

 

posted @ 2020-09-08 15:28  Java领域指导者  阅读(170)  评论(0编辑  收藏  举报