我是个小菜鸡,写了一个系列,面向初学者,有什么错误忘大佬们及时指出加以改正,这个系列主要有eureka、ribbon、feign、hystrix、gateway,简单的搭建与使用
springcloud之eureka
一、Springcloud
我们先来简单回顾一下,我们以往互联网架构的发展情况:
单体架构
单体架构在小微企业比较常见,典型代表就是一个应用、一个数据库、一个 Web 容器就可以跑起来,比如我们开发的开源软件云收藏,就是标准的单体架构。
垂直架构
在单体架构发展一段时间后,公司的业务模式得到了认可,交易量也慢慢的大起来,这时候有些企业为了应对更大的流量,就会对原有的业务进行拆分,比如说:后台系统、前端系统、交易系统等。
在这一阶段往往会将系统分为不同的层级,每个层级有对应的职责,UI 层负责和用户进行交互、业务逻辑层负责具体的业务功能、数据库层负责和上层进行数据交换和存储, 在这个阶段 SSH(Struts+Spring+Hibernate)是项目的关键技术,Struts 负责 Web 层逻辑控制、Spring 负责业务层管理 Bean、Hibernate 负责对数据库操作进行封装,持久化数据。
服务化架构
如果公司进一步的做大,垂直子系统会变的越来越多,系统和系统之间的调用关系呈指数上升的趋势。
在这样的背景下,很多公司都会考虑服务的 SOA 化。SOA 代表面向服务的架构,将应用程序按照不同的职责划分为不同的模块,不同的模块直接通过特定的协议和接口进行交互。
这样将整个系统切分成很多单个组件服务来完成请求,当流量过大时通过水平扩展相应的组件来支撑,所有的组件通过交互来满足整体的业务需求。
SOA 服务化的优点是,它可以根据需求通过网络对松散耦合的粗粒度应用组件进行分布式部署、组合和使用。
服务层是 SOA 的基础,可以直接被应用调用,从而有效控制系统中与软件代理交互的人为依赖性。
服务化架构是一套松耦合的架构,服务的拆分原则是服务内部高内聚,服务之间低耦合。
市面上常见的几种微服务架构:
阿里 dubbo/hsf
京东 jsf
新浪 motan
当当dubbox
……
考虑 Spring Cloud 的原因有如下几点:
1、Spring Cloud 来源于 Spring,质量、稳定性、持续性都可以得到保证。
2、Spirng Cloud 天然支持 Spring Boot,更加便于业务落地。
3、Spring Cloud 发展非常的快,从 2016 年开始接触的时候相关组件版本为 1.x,到现在将要发布 2.x 系列。
4、Spring Cloud 是 Java 领域最适合做微服务的框架。
5、相比于其它框架,Spring Cloud 对微服务周边环境的支持力度最大。
6、对于中小企业来讲,使用门槛较低。
7、Spring Cloud 是微服务架构的最佳落地方案。
总结起来就是:简单、方便、稳定、可扩展性高、适用度广
二、Eureka
如果我们把项目拆分成很多小模块,再后续管理中,你就会发现这个模块调那个模块,大家相互调来调去,那么最终会变成什么样子,变成这个样子
这样最容易导致的情况就是牵一发而动全身,经常出现由于某个服务更新而没有通知到其它服务,导致上线后惨案频发。
为了解决因一个服务宕机而影响其调用服务,而导致雪球效应,对服务与服务之间进行解耦,eureka诞生了
当然服务中心这么重要的组件一旦挂掉将会影响全部服务,因此需要搭建 Eureka 集群来保持高可用性,生产中建议最少两台。
随着系统的流量不断增加,需要根据情况来扩展某个服务,Eureka 内部已经提供均衡负载的功能,只需要增加相应的服务端实例既可。
那么在系统的运行期间某个实例挂了怎么办?Eureka 内容有一个心跳检测机制,如果某个实例在规定的时间内没有进行通讯则会自动被剔除掉,避免了某个实例挂掉而影响服务。
因此使用了 Eureka 就自动具有了注册中心、负载均衡、故障转移的功能。
当然除了这些还有许多,比如负载均衡组件ribbon、服务降级熔断器Hystrix 、微服务网关Zuul 、消息总线bus等,这次不做讲解,只解释服务发现框架。
三、搭建
Jdk1.8+idea
1、
搭建eurekaserver
新建一个springboot项目,演示项目所以我并灭有添加太多的pom,只添加了eurekaserver
项目建好以后就是一个空的项目,删掉项目目录下面的src文件夹,在项目上选择new-module
我们可以选择maven,起好名字一路下一步
例如我起的这个名字叫eurekaServer,那么建好以后我们的项目下面就会多出一个eurekaServer的模块,这个模块现在是空的,首先我们要做的就是手动建一个启动类,例如这样
@EnableEurekaServer
这个是eurekaserver启动类,那么他给我们的项目导入了一个org.springframework.cloud.netflix.eureka.server.EnableEurekaServer包,这个类我们点进去看一下
可以看到它Import导入了EurekaServerMarkerConfiguration类,我们再去看一下这个类
这个EurekaServerMarkerConfiguration会往Spring容器中注入一个eurekaServerMarkerBean,这个Marker是一个空类,那在这里起到什么作用呢?
仔细查看这个类的注释,可以看到它只是一个开关标记,用来激活EurekaServerAutoConfiguration类的。
还有兴趣深入研究的可以看这
https://www.jianshu.com/p/3a3a1a5891ec
那我们现在继续写我们的配置文件
端口、hostname、url,zgelideurl活动写法就是我刚写的这个,如果要硬编码写进去就直接写死,下面我注释掉的是我在测试的时候引入了springsecurity,如果引入security的话,就要写username和password,然后把这个添加到http后面,如果引入security不屑用户名和密码的话,一会我们在登陆的时候就会出现登录页面但是登陆不上去
到现在为止一个空的eurekaserver就配置完毕,我们启动一下当前启动类,然后登陆这个url
现在可以看到,启动成功了,注册中心并没有任何东西,因为我禁止他自己注册自己,我们现在按照同样的方式其写其他的服务,为了便于讲解,我依然写两个空的
一个叫orderServer,一个叫preductServer,启动类基本与注册中心一样,唯一不同的是启动类上注解变成EnableEurekaClient,这个注解有想去的可以去看看,激活服务端
配置文件的话同样
那么这里这个url写的是什么,是注册中心的主机+端口,我给orderServer这个application.name定义为order-client,prudectServer起名叫preduct-client
现在启动这两个类,然后我们在登陆一下注册中心
我们可以看到这里出现了两个注册过的服务
这样我们一个简单的eurekaserver就搭建好了,下面讲讲怎么使用,这里写的都是一些简单的demo
比如获取注册中心某一个服务的host、port、url
我现在获取那么为order-client的信息,运行以后,控制台上面输出
那么现在有一个问题,我们搭建微服务的原因就是降低耦合,某一个服务挂掉以后其他服务还能顶上,但是要是注册中心挂掉怎么办
针对这种情况,我们可以把我们的注册中心配置成两个,取消禁止注册自己,端口写成对方
我们在登陆以后就会发现
这里有两台服务了,两台eurekaserver如果相互注册的话就会有信息同步的功能,那么如果我们的一个server注册到eurekaserver1上面,相对的eurekaserver2上面也会有,但是相对的,如果你的运气不好,注册的server1挂掉了,那就没办法注册了,上面做的是不是就无用了,所以我们的服务端server的url用逗号隔开,同时注册到两台注册中心上,这样就确保万无一失了
其他细节问题:
1、
如果我们服务过多,name记不住怎么办,那么修改配置文件,使用ip+端口注册,例如:
这样我们重启以后就会发现注册中心里面多了ip
2、
eureka的服务剔除
每一个服务每个30秒向注册中心发送心跳监测,告诉自己我还活着,90s没发送,说明我死了,死了怎么办,等好久,大概两分钟以后,eureka才会把你抬走埋了,那么eureka我们可以修改一下这个,叫eureka看到你死了直接就火葬,相对的配置文件是这样
3、
eureka的自我保护机制
如果我的微服务挂掉的太多,比如挂了百分之八十五,挂了百分之九十,那么eureka就会开启自我保护机制,不在尝试剔除挂掉的服务,我们在写代码的时候一般都会关闭,这个也可以用配置文件关闭