基础知识
非常感谢你能打开这篇博文,之前呢因为一些事情在忙一直也没又更新具体的一个全面教程,因一些特殊原因导致我终于能潜下心来进行一个系统化的博文的创作;话不多说开始我们先聊一下Spring Cloud的基本知识。
Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud并没有重复制造轮子,它只是将各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。
上面呢是百度百科对于Spring Cloud的一个解释,说简单点呢就是Cloud就是由大家所熟知的SSM(Spring、Spring MVC、Mybatis)封装默认的配置等成为了Spring Boot然后由Boot为基础搭建成Cloud,暂且可以将Boot认为是Cloud的一个节点(这么描述可能不是很准确但是可以先作为一个理解方式去思考);所以如果你想学习Cloud首先你要了解熟悉SSM框架知道什么是IOC什么是AOP什么是MVC什么是持久化框架,以此为基础循序渐进的阅读这篇博文;
如果你已经看到这一句话证明你很有毅力以及耐心、相信你可以成为一个很好的程序猿!加油啊亲~
接下来我们不去额外讲解SpringBoot 如果不熟悉建议翻阅Boot专栏进行学习;
框架内容
接下来为了方便大家理解给大家稍微讲解一下本次博文的整体包含的内容并在这里做一下简单了解详细的我们在后续会讲;
- 注册中心:字面意思注册的中心那注册的是什么?干什么用?这边说一下我们分布式应用会出现一个项目部署多个节点(你可以认为就是一个项目部署了好几次在不同机器上)那这些节点如何去管控或者提供服务如何保证不一直打在一个节点上?这时候注册中心的作用就出来了,所有的提供服务的(房东)向注册中心(中介)注册自己的服务告诉别人可以提供的服务(房子)服务消费者(租客)需要使用某个或者某些服务(房子)就可以在注册中心(中介)中寻找注册在注册中心(中介)的服务提供者(房东)
- 配置中心:简单理解存放配置的地方,存放的谁的配置?服务提供者(房东)这时候就有个疑问了那那么多的服务提供者(房东)去请求这一个配置中心如果配置中心也挂了那我整体不就废了么?这边就可以跟上面关联一下了,实际上我们搭建时配置中心也是使用的集群配置会部署好几个配置中心,那如何让我们的服务提供者知道去请求哪里?这里我们可以认为配置中心是装修公司,他也向注册中心注册自己也就是说装修公司向中介那边注册一下,之前呢房东也就是服务提供者也去注册了,如果房东想装修房子就直接找中介要装修公司的联系方式就行。
- 服务网关:网关干嘛的?那肯定是分配流量的咯,简单明了来讲这就是个公司的前台美女,流量进来了他会告诉这个流量去找谁
- 熔断器:熔断~熔断~那就是断开的一个器物即工具咯放哪里?请求进来后过了网关去的哪里?服务消费者哪里咯所以他跟消费者集群密不可分
- 消息总线:那肯定是消息的一条线路什么消息的?不知道你们思考过一个问题没有,如果配置更新了我们的服务提供者怎么知道?这时候就是消息总线的作用体现他会通知服务提供者去重新拿配置。
什么?这么枯燥你都看到这里了?你也太有耐心了吧???我阻止不了你了继续往下看吧干货快到了。中国邮z,使命必达~
接下来我们上一个架构图进行开发前的准备工作~
从上看的图里我们可以看到基本上所有的集群都围绕着一个中心那我们第一步先去了解服务注册中心的内容,先完成服务注册中心。
服务注册中心开搞~
这里说明一下服务的注册中心现在在Spring Cloud中已经做了Zookeeper的支持如果需要也可以使用Zookeeper这一张我们只做Zookeeper了解具体使用我们使用Eureka(尤瑞卡);这里说明一下常见的注册中心Zookeeper、Eureka、Consul、Etcd、Nacos等几种。因为Cloud支持的现在暂时只有Zookeeper和Eureka两种且常见的大多为这两种我们着重就了解这两种,若你有兴趣可以自己去了解一下其余的。
接下来讲一下Zookeeper和Eureka的两种注册中心的区别:
- Eureka:符合AP原则为了保证了可用性,Eureka不会等待集群所有节点都已同步信息完毕,它会无时无刻提供服务。
- Zookeeper:符合CP原则为了保证一致性,在所有节点同步完成之前都是阻塞状态的。
分布式系统的三个指标:
- Consistency 一致性
- Availability 可用性
- Partition tolerance 分区容错性
这里我们说一下还有一个点的注意:Zookeeper是有leader的机制如果leader挂掉的话需要去重新选举leader在选举的时候注册中心是不提供服务的
面对疾风吧各位~
第一步
这里我们使用Spring initializr 来生成一个默认的项目第一步项目基本信息不多赘述自己决定叫啥吧我的叫SpringEurekaServer
第二步
这里我们选择版本为2.5.4并且直接在搜索框内填入Eureka可以看到直接有这个选项勾选一下然后Finish一个默认的SpringBoot项目完成,并且pom里也添加了Eureka的jar,当然这还没有结束哦~
jar加载完毕后界面如图~接下来我们去做一下注册中心的配置方面配置直接贴图啦~(多敲敲代码有利于身体健康)
#应用名称,将会显示在Eureka界面的应用名称列
spring:
application:
name: pig
#应用端口Eureka默认端口8761
server:
port: 3355
eureka:
server:
#是否允许开启自我保护模式,缺省:true
#当eureka服务器在短时间内丢失过多客户端时,自我保护可使服务端不再删除失去链接的客户端
enable-self-preservation: true
#peer 节点更新间隔,单位毫秒
peer-eureka-nodes-update-interval-ms: 30000
#Eureka服务器清理无效节点的时间间隔,单位:毫秒,缺省:60000,即60秒
eviction-interval-timer-in-ms: 60000
instance:
#服务名,默认取 spring.application.name 配置值,如果没有则为 unknown
appname: pig
#实例ID
instance-id: eureka-pig
#应用实例主机名
hostname: localhost
#客户端在注册时使用自己的IP而不是主机名,缺省:false
prefer-ip-address: false
#应用实例IP
ip-address: 127.0.0.1
#服务失效时间,失效的服务将被剔除。单位:秒,默认:90
lease-expiration-duration-in-seconds: 90
#服务续约(心跳)频率,单位:秒,缺省30
lease-renewal-interval-in-seconds: 30
#状态页面的URL,相对路径,默认使用 HTTP 访问,如需使用 HTTPS则要使用绝对路径配置,缺省:/info
status-page-url-path: /info
#健康检查页面的URL,相对路径,默认使用 HTTP 访问,如需使用 HTTPS则要使用绝对路径配置,缺省:/health
health-check-url-path: /health
client:
#是否向注册中心注册自己
register-with-eureka: true
# 是否能够获取Eureka注册信息
fetch-registry: true
# 暴露自己的服务中心地址
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka
注意: 这边我在代码中写的defaultZone是正确的,如果你的yml有自动提示可能会提示你是default-zone你在启动的时候会发现如下一条信息端口并非我们命名的端口~
Request execution error. endpoint=DefaultEndpoint{ serviceUrl='http://localhost:8761/eureka/}, exception=java.net.ConnectException: Connection refused (Connection refused) stacktrace=com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused (Connection refused)
at com.sun.jersey.client.apache4.ApacheHttpClient4Handler.handle(ApacheHttpClient4Handler.java:187)
at com.sun.jersey.api.client.filter.GZIPContentEncodingFilter.handle(GZIPContentEncodingFilter.java:123)
at com.netflix.discovery.EurekaIdentityHeaderFilter.handle(EurekaIdentityHeaderFilter.java:27)
at com.sun.jersey.api.client.Client.handle(Client.java:652)
at com.sun.jersey.api.client.WebResource.handle(WebResource.java:682)
at com.sun.jersey.api.client.WebResource.access$200(WebResource.java:74)
at com.sun.jersey.api.client.WebResource$Builder.post(WebResource.java:570)
at com.netflix.discovery.shared.transport.jersey.AbstractJerseyEurekaHttpClient.register(AbstractJerseyEurekaHttpClient.java:57)
at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator$1.execute(EurekaHttpClientDecorator.java:59)
at com.netflix.discovery.shared.transport.decorator.MetricsCollectingEurekaHttpClient.execute(MetricsCollectingEurekaHttpClient.java:73)
at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.register(EurekaHttpClientDecorator.java:56)
at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator$1.execute(EurekaHttpClientDecorator.java:59)
at com.netflix.discovery.shared.transport.decorator.RedirectingEurekaHttpClient.executeOnNewServer(RedirectingEurekaHttpClient.java:121)
at com.netflix.discovery.shared.transport.decorator.RedirectingEurekaHttpClient.execute(RedirectingEurekaHttpClient.java:80)
at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.register(EurekaHttpClientDecorator.java:56)
at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator$1.execute(EurekaHttpClientDecorator.java:59)
at com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient.execute(RetryableEurekaHttpClient.java:120)
at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.register(EurekaHttpClientDecorator.java:56)
at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator$1.execute(EurekaHttpClientDecorator.java:59)
at com.netflix.discovery.shared.transport.decorator.SessionedEurekaHttpClient.execute(SessionedEurekaHttpClient.java:77)
at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.register(EurekaHttpClientDecorator.java:56)
at com.netflix.discovery.DiscoveryClient.register(DiscoveryClient.java:876)
at com.netflix.discovery.InstanceInfoReplicator.run(InstanceInfoReplicator.java:121)
at com.netflix.discovery.InstanceInfoReplicator$1.run(InstanceInfoReplicator.java:101)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
上面就是我列出的差不多常用的一些Server配置各位按需取用嗷~到这一步基本上Eureka就完成了但是还没完全完成还缺少了一点东西就是注解如下图👇(我这边用的yml编写的)
到这一步一个注册中心的服务端基本完成啦~🎉🎉🎉
敲黑板!!!!这里我只写了一个配置中心服务端的配置文件如果要搭建一个注册中心集群的话各位自己最少建立三个哦~自己体验吧
接下来我们运行一下看效果!如下图👇
运行完成啦~控制台报错我们先不用管如果有点基础的同学估计已经明白了可以看到第一个错误说的是没有找到对应端口的Eureka,但是饭要一口口吃嘛下一步我们继续完善下去。写的挺多了各位先阅读了解一下今天的东西吧~因为今天的东西主要理论内容比较多所以这篇博文我就先写到这里防止太多了一次行消化不了。