参考:http://blog.csdn.net/forezp/article/details/70148833
本文demo 参考以上文章进行搭建 ,很详细的一篇文章。
本文只对不同的地方,遇到的小坑 和一些想法写一下。
文章里环境用的IDE JDK8 maven4.0
我这里用的是STS 4.9 剩下都一样
主要搭建服务 分别为 eureka 服务注册 和发现
ribbon + restTemplate 实现负载均衡
feign 默认集成了ribbon,也是实现了负载均衡,所以用feign的比较多
hystrix 断路器,当某个服务出现问题时,会返回一个固定值,避免出现底层服务的连锁故障。
zuul 路由功能,功能和nginx差不多,主要功能还是代理转发和过滤。相比Nginx是自带负载均衡,而zuul是配合eureka,feign进行负载均衡
config 配置中心,利用集群实现配置的统一管理
Bus 消息总线,中间利用轻量级 AMQ 通过API来实现配置更改后的热部署/bus/refush 和实现服务之间的通信
参考文章中整体项目为 maven project ,包含众多model模块来实现。每个模块都实现自己的功能。
我自己进行了一个依赖抽取到父类pom,子模块依赖自己的依赖就可以了。
依旧Parent为 spring-boot-starter-parent 只不过这次的版本用的1.5.2
设置项目编码格式 和JDK 版本为 1.8
设置3个公用的依赖 分别为 eureka boot-start-web boot-start-test
余下子模块项目分别设置自己的自有自来即可,不用像参考文章里那么复杂,每个子模块 pom都是一大堆。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.demo</groupId>
<artifactId>springCloudDemo</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<name>Parent Project</name>
<modules>
<module>ribbon</module>
<module>eurekaServer</module>
<module>eurekaClient</module>
<module>feign</module>
<module>zuul</module>
<module>configServer</module>
<module>configClient</module>
</modules>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.RELEASE</version>
<relativePath/>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<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>
<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>Dalston.RC1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>
剩下的代码 基本就是跟着参考来。
euraka + feign 基本实现了zookper的负载均衡+服务注册发现功能,
在分布式系统领域有个著名的CAP定理(C-数据一致性;A-服务可用性;P-服务对网络分区故障的容错性,)
区别在于 zookper被设计为CP模式,即任何时刻对ZooKeeper的访问请求能得到一致的数据结果,同时系统对网络分割具备容错性
euraka 则设计为AP模式,各自为战,无法保证数据的一致性,但是在可用性和容错性上要比zookper要更健壮。
如果一个服务器挂机,那么euraka 为自动将请求通过负载均衡转移到有效的请求节点上,如果都挂了,也有断路器的存在 返回一个固定值,总比zookper的timeOut友好的多
euraka 想比于zookper,少了一个选举leader的过程,减少了维护,也有自动刷新缓存和发布服务等对外暴露的接口。
注:参考文章中 第七章 高可用的Config配置中心在 配置 config server 和 config client 在启动类上缺少@EnableEurekaClient 注解,否则无法在eureka中注册服务。
出现过的坑:
在测试zuul demo 过程中,先后启动 eureka-server,eureka-client,ribbon,feign,最后启动zuul,启动成功,查看eureka管理界面有每个项目的成功情况,但是刚启动zuul有几秒的时间 访问任何请求都会报500的错误,提示没有对应的 ribbo 或者 feign服务,过几秒自己就好了。可以正常负载均衡访问 eureka-client了, 很不友好。
然后关闭eureka-client进程,正常应该及时启动断路器,返回断路器的固定值信息,
但是关闭后有2分钟左右时间 请求访问都是报错,time out and no fallMethod back.
测试了好几遍都是这样!
蛋疼哦!!!有遇到这个问题解决了的嘛,请分享一下