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