建设商务网站目的,手机把网站做成软件,网站免费搭建,附近广告设计与制作门店电话Spring Cloud简介 最大的区别是Eureka保证AP, Consul为CP。
Consul强一致性(C)带来的是#xff1a;
服务注册相比Eureka会稍慢一些。因为Consul的raft协议要求必须过半数的节点都写入成功才认为注册成功 Leader挂掉时#xff0c;重新选举期间整个consul不可用。保证了强一致… Spring Cloud简介 最大的区别是Eureka保证AP, Consul为CP。
Consul强一致性(C)带来的是
服务注册相比Eureka会稍慢一些。因为Consul的raft协议要求必须过半数的节点都写入成功才认为注册成功 Leader挂掉时重新选举期间整个consul不可用。保证了强一致性但牺牲了可用性。 Eureka保证高可用(A)和最终一致性
服务注册相对要快因为不需要等注册信息replicate到其他节点也不保证注册信息是否replicate成功 当数据出现不一致时虽然A, B上的注册信息不完全相同但每个Eureka节点依然能够正常对外提供服务这会出现查询服务信息时如果请求A查不到但请求B就能查到。如此保证了可用性但牺牲了一致性。 其他方面eureka就是个servlet程序跑在servlet容器中; Consul则是go编写而成。
这里就平时经常用到的服务发现的产品进行下特性的对比首先看下结论:
服务的健康检查 Euraka 使用时需要显式配置健康检查支持Zookeeper,Etcd 则在失去了和服务进程的连接情况下任务不健康而 Consul 相对更为详细点比如内存是否已使用了90%文件系统的空间是不是快不足了。
多数据中心支持 Consul 通过 WAN 的 Gossip 协议完成跨数据中心的同步而且其他的产品则需要额外的开发工作来实现
KV 存储服务 除了 Eureka ,其他几款都能够对外支持 k-v 的存储服务所以后面会讲到这几款产品追求高一致性的重要原因。而提供存储服务也能够较好的转化为动态配置服务哦。
产品设计中 CAP 理论的取舍 Eureka 典型的 AP,作为分布式场景下的服务发现的产品较为合适服务发现场景的可用性优先级较高一致性并不是特别致命。其次 CA 类型的场景 Consul,也能提供较高的可用性并能 k-v store 服务保证一致性。 而Zookeeper,Etcd则是CP类型 牺牲可用性在服务发现场景并没太大优势
多语言能力与对外提供服务的接入协议 Zookeeper的跨语言支持较弱其他几款支持 http11 提供接入的可能。Euraka 一般通过 sidecar的方式提供多语言客户端的接入支持。Etcd 还提供了Grpc的支持。 Consul除了标准的Rest服务api,还提供了DNS的支持。
Watch的支持客户端观察到服务提供者变化 Zookeeper 支持服务器端推送变化Eureka 2.0(正在开发中)也计划支持。 Eureka 1,Consul,Etcd则都通过长轮询的方式来实现变化的感知
自身集群的监控 除了 Zookeeper ,其他几款都默认支持 metrics运维者可以搜集并报警这些度量信息达到监控目的
安全 Consul,Zookeeper 支持ACL另外 Consul,Etcd 支持安全通道https.
Spring Cloud的集成 目前都有相对应的 boot starter提供了集成能力。
总的来看目前Consul 自身功能和 spring cloud 对其集成的支持都相对较为完善而且运维的复杂度较为简单没有详细列出讨论Eureka 设计上比较符合场景但还需持续的完善。
Spring Cloud是一个基于Spring Boot实现的云应用开发工具它为基于JVM的云应用开发中涉及的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等操作提供了一种简单的开发方式。
Spring Cloud包含了多个子项目针对分布式系统中涉及的多个不同开源产品比如Spring Cloud Config、Spring Cloud Netflix、Spring Cloud0 CloudFoundry、Spring Cloud AWS、Spring Cloud Security、Spring Cloud Commons、Spring Cloud Zookeeper、Spring Cloud CLI等项目。
微服务架构
“微服务架构”在这几年非常的火热以至于关于微服务架构相关的开源产品被反复的提及比如netflix、dubboSpring Cloud也因Spring社区的强大知名度和影响力也被广大架构师与开发者备受关注。
那么什么是“微服务架构”呢简单的说微服务架构就是将一个完整的应用从数据存储开始垂直拆分成多个不同的服务每个服务都能独立部署、独立维护、独立扩展服务与服务间通过诸如RESTful API的方式互相调用。
对于“微服务架构”大家在互联网可以搜索到很多相关的介绍和研究文章来进行学习和了解。也可以阅读始祖Martin Fowler的《Microservices》中文版翻译点击查看本文不做更多的介绍和描述。
服务治理
在简单介绍了Spring Cloud和微服务架构之后下面回归本文的主旨内容如何使用Spring Cloud来实现服务治理。
由于Spring Cloud为服务治理做了一层抽象接口所以在Spring Cloud应用中可以支持多种不同的服务治理框架比如Netflix Eureka、Consul、Zookeeper。在Spring Cloud服务治理抽象层的作用下我们可以无缝地切换服务治理实现并且不影响任何其他的服务注册、服务发现、服务调用等逻辑。
所以下面我们通过介绍两种服务治理的实现来体会Spring Cloud这一层抽象所带来的好处。
Spring Cloud Eureka
首先我们来尝试使用Spring Cloud Eureka来实现服务治理。
Spring Cloud Eureka是Spring Cloud Netflix项目下的服务治理模块。而Spring Cloud Netflix项目是Spring Cloud的子项目之一主要内容是对Netflix公司一系列开源产品的包装它为Spring Boot应用提供了自配置的Netflix OSS整合。通过一些简单的注解开发者就可以快速的在应用中配置一下常用模块并构建庞大的分布式系统。它主要提供的模块包括服务发现Eureka断路器Hystrix智能路由Zuul客户端负载均衡Ribbon等。
下面就来具体看看如何使用Spring Cloud Eureka实现服务治理。
创建“服务注册中心”
创建一个基础的Spring Boot工程命名为eureka-server并在pom.xml中引入需要的依赖内容 parentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion1.5.4.RELEASE/versionrelativePath/
/parentdependenciesdependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-eureka-server/artifactId/dependency
/dependenciesdependencyManagementdependenciesdependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-dependencies/artifactIdversionDalston.SR1/versiontypepom/typescopeimport/scope/dependency/dependencies
/dependencyManagement通过EnableEurekaServer注解启动一个服务注册中心提供给其他应用进行对话。这一步非常的简单只需要在一个普通的Spring Boot应用中添加这个注解就能开启此功能比如下面的例子 EnableEurekaServer
SpringBootApplication
public class Application {public static void main(String[] args) {new SpringApplicationBuilder(Application.class).web(true).run(args);}
}在默认设置下该服务注册中心也会将自己作为客户端来尝试注册它自己所以我们需要禁用它的客户端注册行为只需要在application.properties配置文件中增加如下信息 spring.application.nameeureka-server
server.port1001eureka.instance.hostnamelocalhost
eureka.client.register-with-eurekafalse
eureka.client.fetch-registryfalse为了与后续要进行注册的服务区分这里将服务注册中心的端口通过server.port属性设置为1001。启动工程后访问http://localhost:1001/可以看到下面的页面其中还没有发现任何服务。 创建“服务提供方”
下面我们创建提供服务的客户端并向服务注册中心注册自己。本文我们主要介绍服务的注册与发现所以我们不妨在服务提供方中尝试着提供一个接口来获取当前所有的服务信息。
首先创建一个基本的Spring Boot应用。命名为eureka-client在pom.xml中加入如下配置 parent groupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion1.5.4.RELEASE/versionrelativePath/ !-- lookup parent from repository --
/parentdependenciesdependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-eureka/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency
/dependenciesdependencyManagementdependenciesdependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-dependencies/artifactIdversionDalston.SR1/versiontypepom/typescopeimport/scope/dependency/dependencies
/dependencyManagement其次实现/dc请求处理接口通过DiscoveryClient对象在日志中打印出服务实例的相关内容。 RestController
public class DcController {AutowiredDiscoveryClient discoveryClient;GetMapping(/dc)public String dc() {String services Services: discoveryClient.getServices();System.out.println(services);return services;}}最后在应用主类中通过加上EnableDiscoveryClient注解该注解能激活Eureka中的DiscoveryClient实现这样才能实现Controller中对服务信息的输出。 EnableDiscoveryClient
SpringBootApplication
public class Application {public static void main(String[] args) {new SpringApplicationBuilder(ComputeServiceApplication.class).web(true).run(args);}
}我们在完成了服务内容的实现之后再继续对application.properties做一些配置工作具体如下 spring.application.nameeureka-client
server.port2001
eureka.client.serviceUrl.defaultZonehttp://localhost:1001/eureka/通过spring.application.name属性我们可以指定微服务的名称后续在调用的时候只需要使用该名称就可以进行服务的访问。eureka.client.serviceUrl.defaultZone属性对应服务注册中心的配置内容指定服务注册中心的位置。为了在本机上测试区分服务提供方和服务注册中心使用server.port属性设置不同的端口。
启动该工程后再次访问http://localhost:1001/。可以如下图内容我们定义的服务被成功注册了。 当然我们也可以通过直接访问eureka-client服务提供的/dc接口来获取当前的服务清单只需要访问http://localhost:2001/dc我们可以得到如下输出返回 Services: [eureka-client]其中方括号中的eureka-client就是通过Spring Cloud定义的DiscoveryClient接口在eureka的实现中获取到的所有服务清单。由于Spring Cloud在服务发现这一层做了非常好的抽象所以对于上面的程序我们可以无缝的从eureka的服务治理体系切换到consul的服务治理体系中区。
Spring Cloud Consul
Spring Cloud Consul项目是针对Consul的服务治理实现。Consul是一个分布式高可用的系统它包含多个组件但是作为一个整体在微服务架构中为我们的基础设施提供服务发现和服务配置的工具。它包含了下面几个特性
服务发现健康检查Key/Value存储多数据中心
由于Spring Cloud Consul项目的实现我们可以轻松的将基于Spring Boot的微服务应用注册到Consul上并通过此实现微服务架构中的服务治理。
以之前实现的基于Eureka的示例eureka-client为基础我们如何将之前实现的服务提供者注册到Consul上呢方法非常简单我们只需要在pom.xml中将eureka的依赖修改为如下依赖 dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-consul-discovery/artifactId
/dependency接下来再修改一下application.properites将consul需要的配置信息加入即可比如下面配置是默认值 spring.cloud.consul.hostlocalhost
spring.cloud.consul.port8500到此为止我们将eureka-client转换为基于consul服务治理的服务提供者就完成了。前文我们已经有提到过服务发现的接口DiscoveryClient是Spring Cloud对服务治理做的一层抽象所以可以屏蔽Eureka和Consul服务治理的实现细节我们的程序不需要做任何改变只需要引入不同的服务治理依赖并配置相关的配置属性就能轻松的将微服务纳入Spring Cloud的各个服务治理框架中。
下面可以尝试让consul的服务提供者运行起来。这里可能读者会问不需要创建类似eureka-server的服务端吗由于Consul自身提供了服务端所以我们不需要像之前实现Eureka的时候创建服务注册中心直接通过下载consul的服务端程序就可以使用。
我们可以用下面的命令启动consul的开发模式 $consul agent -devStarting Consul agent...Starting Consul agent RPC...Consul agent running!Version: v0.7.2Node name: Lenovo-zhaiycDatacenter: dc1Server: true (bootstrap: false)Client Addr: 127.0.0.1 (HTTP: 8500, HTTPS: -1, DNS: 8600, RPC: 8400)Cluster Addr: 127.0.0.1 (LAN: 8301, WAN: 8302)Gossip encrypt: false, RPC-TLS: false, TLS-Incoming: falseAtlas: disabled Log data will now stream in as it occurs:2017/06/22 07:50:54 [INFO] raft: Initial configuration (index1): [{Suffrage:Voter ID:127.0.0.1:8300 Address:127.0.0.1:8300}]2017/06/22 07:50:54 [INFO] raft: Node at 127.0.0.1:8300 [Follower] entering Follower state (Leader: )2017/06/22 07:50:54 [INFO] serf: EventMemberJoin: Lenovo-zhaiyc 127.0.0.12017/06/22 07:50:54 [INFO] consul: Adding LAN server Lenovo-zhaiyc (Addr: tcp/127.0.0.1:8300) (DC: dc1)2017/06/22 07:50:54 [INFO] serf: EventMemberJoin: Lenovo-zhaiyc.dc1 127.0.0.12017/06/22 07:50:54 [INFO] consul: Adding WAN server Lenovo-zhaiyc.dc1 (Addr: tcp/127.0.0.1:8300) (DC: dc1)2017/06/22 07:51:01 [ERR] agent: failed to sync remote state: No cluster leader2017/06/22 07:51:02 [WARN] raft: Heartbeat timeout from reached, starting election2017/06/22 07:51:02 [INFO] raft: Node at 127.0.0.1:8300 [Candidate] entering Candidate state in term 22017/06/22 07:51:02 [DEBUG] raft: Votes needed: 12017/06/22 07:51:02 [DEBUG] raft: Vote granted from 127.0.0.1:8300 in term 2. Tally: 12017/06/22 07:51:02 [INFO] raft: Election won. Tally: 12017/06/22 07:51:02 [INFO] raft: Node at 127.0.0.1:8300 [Leader] entering Leader state2017/06/22 07:51:02 [INFO] consul: cluster leadership acquired2017/06/22 07:51:02 [INFO] consul: New leader elected: Lenovo-zhaiyc2017/06/22 07:51:02 [DEBUG] consul: reset tombstone GC to index 32017/06/22 07:51:02 [INFO] consul: member Lenovo-zhaiyc joined, marking health alive2017/06/22 07:51:02 [INFO] agent: Synced service consul2017/06/22 07:51:02 [DEBUG] agent: Node info in syncconsul服务端启动完成之后我们再将之前改造后的consul服务提供者启动起来。consul与eureka一样都提供了简单的ui界面来查看服务的注册情况 更多关于Consul的使用指南读者可查看官方文档https://www.consul.io/
更多Spring Cloud内容请持续关注我的博客更新或在《Spring Cloud微服务实战》中获取。
代码示例
样例工程将沿用之前在码云和GitHub上创建的SpringCloud-Learning项目重新做了一下整理。通过不同目录来区分Brixton和Dalston的示例。
码云点击查看GitHub点击查看
具体工程说明如下
eureka的服务注册中心eureka-servereureka的服务提供方eureka-clientconsul的服务提供方consul-client