Spring Cloud微服务之eureka+client入门
谈到服务,想到一种“懒人思维”。家政服务为懒人收拾家务提供一种便利,快餐服务为不爱做饭的懒人提供一种方便.....等等。
说到微服务,顾名思义,就是把服务再细微化。比如需要送女友一束花表达情意,又不想自己去花店,去花店又不想等,这里面就有了定花服务,包花服务,送花服务等,如下图所示。
对于这样的一个流程服务,如果需要一种架构为开发的,可以有以下三种架构形式。
一、由架构形式谈到微服务
1、完成这个逻辑可以使用单体架构
单体架构:将整个定花、包花和送花涉及的业务所有功能集中在一个项目中开发,比如这里就包含了定花模块、包花模块、送花模块等等,这个程序在部署时就是一个进程,比如就把一个war包部署到tomcat中。
这种架构会有一些问题:
(1)所有业务的功能模块都聚集在一起,如果代码量多,可能在定花,包花,送花代码实现过程中有共同的代码,不同业务的需求开发同时进行的时候,维护起来有点麻烦
(2)由于是单体,对请求的并发量,有限制,一个tomcat,并发量千级左右
(3)由于代码都堆在了一起,部署起来慢
(4)后期再进行扩展,成本会很高,假设需要替换更加爽一点的内存以及高效的磁盘。但在这种单体架构上 无法针对单个功能模块进行扩展。
(7)前后端不分离,后端开发人员可能要具备相应的前端知识
2、使用这个逻辑可以使用分布式构架
分布式架构:根据整个定花、包花和送花涉及的业务功能对系统做拆分,每个业务成为一种服务,定花成为定花服务,包花成为包花服务,送花成为送花服务。不同的服务分布在不同的服务器节点,共同构成的系统称为分布式系统,这些服务器可能放在不同的机柜中,也可能在不同的机房中,甚至分布在不同的城市。在空间部署上是可以随意分布的。如下图所示。
这里要注意区分出分布式和集群的区别,分布式在于多个服务器做不同的事情,单纯谈集群只是多台服务器完成相同的几种服务。
集群原理图如下。
集群架构只是改善了,单体架构的单点故障问题和提高请求的并发数
而对分布式结构来说,虽然服务已经分开,降低服务耦合,但服务拆分的粒度如何去界定,服务之间调用如何更好的管理也会发生问题。需要制定一套行之有效的标准来约束分布式架构。
3、完成这个逻辑使用微服务。
微服务拆分粒度会更小,每一个服务都对应唯一的业务能力,做到单一职责。采取自治的特点,团队独立、技术独立、数据独立、独立部署和交付,服务提供统一标准的接口,与语言和技术无关,尤其是网络的容错性方面,由于网络之间需要通信,一旦节点出现故障,就会出现重发或者失败的信息,服务调用能够做好隔离、容错、降级,避免出现级联问题。
图中所显示的可能也只是定花、包花、送花三个服务微服务中的冰山一角,还可以有微信订花,公众号订花,定制包花,定点送花等等,包括订花失败服务,包花异常服务,送花异常服务等等,在微服务的细微颗粒化中,只有想不到的服务,没有完善不了的服务。这样的一个一个的小服务就是微服务。
其实微服务就是在给分布式架构定制一个标准,进一步降低服务之间的耦合度,提供服务的独立性和灵活性。做到高内聚,低耦合。
因此,我们可以认为微服务是一种经过良好架构设计的分布式架构方案。
Spring cloud具备了微服务框架结构。
二、spring cloud
Spring Cloud是一系列框架的有序集合。其利用了Spring Boot的开发便利性巧妙地应用了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。
微服实际就是业务垂直拆分的再次拆分,划分的服务粒度更细。
其优点在于: 每个子项目功能单一,结构清晰,代码易维护。同时错误大量减少,出现BUG几率也小,开发效率高,代码量小,数据库分开随之带来数据库访问压力急剧降低。
其也有一定的缺点: 系统多了,系统之间调用变复杂,代码跨网络需要转换成二进制字节流,就涉及到序列化和反序列化,这样耗费时间长,####如果网络不稳定也会影响程序的稳定性。
三、微服务架构图
微服务在架构上需要有注册中心,通过注册中心注册服务,有统一的网关路由,也可以跟踪链路......等,具体需要的结构组件如下图所示。
在这几个结构组件中,能够通过注册中心注册,统一配置来进行协调工作,具体组件流程框架如下图所示。
图中 涉及到Eureka注册中心,服务提供者,业务消费者,Ribbon负载均衡(类似nginx的功能),Feign REST封装, Hystrix 断路器,Zuul API网关, SpringCloudConfig配置中心,数据存在Git,版本控制
Eureka注册中心,服务提供者和服务消费者之间协调工作如下:
1.注册中心 : Eureka server, 负责"保存"的服务(服务指的service子级项目的controller配置路径)
2.生产者: Eureka Client, 负责将服务发送到注册中心,由注册中心负责保存.
3.消费者: Eureka Client, 作用: 用户就是消费者,在客户端输入访问地址(地址服务),如果在注册中心由服务,就去访问,
4.如果在注册中心没有改服务,就报404
注册中心, 生产者, 消费者 三者之间的关系总结起来通过心跳机制来管理服务,如下图所示。
注意它的特点,结构类似于消息队列,不管是服务提供者还是服务消费者都注册到注册中心。而且不会每次都去注册中心获取,而是有本地缓存,加快访问性能。内部含有心跳机制,当注册中心信息改变,自动快速获取新的信息到本地。心跳机制还保证分布式环境下,某个服务失败后,自动列表从注册中心移除。注册中心中保证所有可用的链接。
同时,还要注意分布式系统中最核心最重要的理论有一个CAP原则,CAP原则又称CAP定理,指的是在一个分布式系统中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可得兼。
如下图所示。
图中Consistency表示一致性,表示所有客户端总是展现同样的数据。
图中Avaliability表示可用性,表示每个客户端总是能读写。
图中Partition Tolerance表示分区容错性,表示当集群中的某些节点无法联系时,仍然能正常提供服务。
图中CA是一致性和可用性的统一,表示有一致性和可用性的系统,通常可扩展性能不高,不具备分区容错性,如传统的关系数据库。
图中CP是一致性和分区容错性统一,表示为满足一致性,在系统分区期间会停止服务,直到数据恢复。
图中AP是可用性和分区容错性的统一,表示通常注重系统性能和扩展性,而非强调一致性。
图中所示的分布式系统的CAP理论,这个理论首先把分布式系统中的三个特性进行了如下归纳:
一致性说明在分布式系统中的所有数据备份,在同一时刻是否同样的值,等同于所有节点访问同一份最新的数据副本。
可用性说明在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求,等同于对数据更新具备高可用性。
分区容错性说明以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择。
前面是理论,后面是实践,光说不练,假把式。
下面进入微服务服务端和客户端入门的初步。
四、微服务EurekaServer的建立
1、点击File--->New---->Project.....,如下图。
2、在弹出的地话框中,左边点击Spring Initializr,表示Spring的初始程序,右边在默认的地方可能会初始化失败,需要选择自定义的地址:http://start.aliyun.com。如右图所示。
3、在接下来的弹出框中输入spring cloud项目名称的Group和artifactId。如下图所示。
4、点击Next进入下一步,左边先点击Web,右边点击Spring web可以建立Web应用程序。如下图。
5、继续在这个对话框中,左边点击Spring Cloud Discovery,右边点击Eureka Server,如下图所示。
6、然后点击Next进入到“下一步”,会出现对话框。如下图所示。
7、在出现的对话框中,点击Finish后完成项目的构建向导。
项目框架建立后,修改主程序中的主类,如下图所示。
8、在打开的主程序中,加入注解@EnableEurekaServer。
eurekaserver的程序代码如下。
package com.myfirsteurekabalance.myfirsteurekabalance;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class MyfirsteurekabalanceApplication {
public static void main(String[] args) {
SpringApplication.run(MyfirsteurekabalanceApplication.class, args);
}
}
9、下面需要编辑resources下面的application.yml文件,在原来的resouces目录下只有application.properties,需要把application.properties改成application.yml。然后编辑该文件。
10、application.yml的文件内容如下。
# 应用名称
spring:
application:
name: myfirsteurekabalance
# 应用服务 WEB 访问端口
server:
port: 8011
eureka:
client:
register-with-eureka: true
fetch-registry: false
service-url:
defaultZone: http://localhost:8011/eureka
instance:
hostname: myprovider1
其文件内容的解释如下图.
二、Eureka客户端的搭建
1、同样点击File--->New----->Project....,如下图所示。
2、在打开的对话框中,左边继续点击Spring Initializr,表示Spring的初始程序,右边在默认的地方可能会初始化失败,需要选择自定义的地址:http://start.aliyun.com。如下图所示。
3、点击Next,然后在出现的对话框中输入项目名称。如下图所示。
4、在接下来出现的对话框中,左边选择Web,右边选择Spring Web。如下图所示。
5、继续在这个对话框中,左边选择Spring Cloud Discovery,右边选择Eureka Discovery Client。如下图所示。
6、然后点击下一步即Next,在出现的对话框中直接点击Finish完成项目建立的向导。如下图所示。
在主程序中输入EnableEurekeClient或者是@EnableDiscoveryClient都可以实现Eureka客户端的发现。
客户端的代码如下。
package com.myfirsteurekaclient01.myfirsteurekaclient01;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient
public class Myfirsteurekaclient01Application {
public static void main(String[] args) {
SpringApplication.run(Myfirsteurekaclient01Application.class, args);
}
}
现在可以做一个controller的package包,然后定义一个RestController的控制器。代码如下。
package com.myfirsteurekaclient01.myfirsteurekaclient01.controller;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@RestController
public class PageController {
@GetMapping("/hello/{name}")
public String hello(@PathVariable("name")String name){
return "hello,"+name;
}
}
现在再次修改application.yml文件。如下图所示。
然后,application.yml的具体内容如下所示。
# 应用名称
spring:
application:
name: myfirsteurekaclient01
# 应用服务 WEB 访问端口
server:
port: 8008
eureka:
client:
service-url:
defaultZone: http://localhost:8011/eureka
其内容的大体解释如下。
现在可以先运行EurekaServer的程序,然后再运行客户端的主程序。
注册中心的访问http://localhost:8011,效果如下。
客户端启动后,可以访顺具体的请求地址,http://localhost:8080/hello/lili。访问效果如下图。
这时,客户端启动成功。
欢迎继续关注博客,后续带来微服务其他组件。
码云地址:
https://gitee.com/who_moved_my_cigarette/spring_cloud_server_client_Intruduction/tree/master/