1.什么是微服务
将一个独立的系统拆分成若干小的服务,每个小服务运行在不同的进程中,服务与服务之间采用http 轻量协议(比如流行的RESTful)传输数据,每个服务所拥有的功能具有独立性强、高内聚的特点,这样的设计就实现了单个服务的高内聚,服务与服务之间的低耦合效果,这一个一个的小服务就是微服务
微服务的技术栈
负载均衡,网关路由:高可用、集群部署,校验、请求转发、服务集成。
服务治理:服务注册、发现。
容错:避免雪崩。
监控跟踪:监控资源利用、服务响应、容器资源利用情况。
消息总线:消息队列、异步通信。
配置管理:统一配置管理。
2.Spring Cloud是什么
Spring Cloud为开发人员构建微服务架构提供了完整的解决方案,SpringCloud是若干个框架的集合,它包括spring-cloud-config、spring-cloud-bus等近20个子项目,它提供了服务治理、服务网关、智能路由、负载均衡、断路器、监控跟踪、分布式消息队列、配置管理等领域的解决方案。
微服务相关技术:
服务治理:Dubbo(阿里巴巴)、Dubbox(当当)、Eureka(Netflix)等 。
配置管理:Disconf(百度)、QConf(360)、Diamood(淘宝)、Config(Spring Cloud)等 。
服务跟踪:Hydra(京东)、Zipkin(Twitter)、Sleuth(Spring Cloud)等 。
Spring Cloud的很多技术来源于Netfix(https://netflix.github.io/),在开源产品基础上做的二次封装,使用Spring Cloud来构建微服务架构可以省去整合各家技术的成本,Spring Cloud为我们构建微服务架构提供了一站式的解决方案,如下图:
3.Spring Cloud Eureka
Spring Cloud Eureka 是对Netflix公司的Eureka的二次封装,它实现了服务治理的功能,Spring Cloud Eureka提供服务端与客户端,服务端即是服务注册中心,客户端完成服务的注册与发现。服务端和客户端均采用Java语言编写(Eureka支持多语言)。
如下图显示了Eureka Server与Eureka Client的关系:
原理:
开发部署Eureka Server:
1、创建Spring Boot工程
2、在pom.xml中添加依赖(spring boot 、spring cloud、Eureka Server)
3、配置application.yml
4、部署两台Eureka Server,并且互相注册,实现高可用。
4.开发用户信息服务demo
用户信息服务实现用户信息查询
开发用户信息服务采用Spring Boot、SpringMVC、Mybatis架构
2.1 服务注册
服务注册完成将用户信息服务注册到Eureka Server中,供服务消费方查询。
1、在用户信息服务中配置Eureka服务中心地址及用户信息服务名称。
2、在SpringBoot的启动类中添加注解@EnableDiscoveryClient、@ComponentScan、@MapperScan
5.Spring Cloud Ribbon
Spring Cloud Ribbon是基于客户端的负载均衡工具,客户端要维护一份服务列表,Ribbon从Eureka Server获取服务列表,Ribbon根据负载均衡算法直接请求到具体的微服务,负载均衡算法有:轮训、随机、加权轮训、加权随机、地址哈希等方法,可以通过参数指定负载均衡算法
如下图是Ribbon负载均衡的流程图:
1、在消费微服务中使用Ribbon实现负载均衡,Ribbon先从Eureka Server中获取服务列表。
2、Ribbon根据负载均衡的算法进行负载均衡,将请求转发到其它微服务。
原理图:
6.开发单点登录服务demo
单点登录服务提供用户登录功能。
单点登录服务需要调用用户信息服务查询用户信息。
单点登录服务采用Spring Boot、SpringMVC开发。
单点登录服务需要从EurekaServer查询用户信息服务。
1、配置Eureka Server服务地址。
2、在SpringBoot的启动类中添加注解@EnableDiscoveryClient,@EnableHystrix
Ribbon编程:
1、定义RestTemplate对象
2、配置 @LoadBalanced
3、使用RestTemplate调用微服务
7.Spring Cloud Hystrix
容错保护是指微服务在执行过程中出现错误并从错误中恢复的能力。微服务容错性不好很容易导致雪崩效应
微服务的雪崩效应表现在服务与服务之间调用,当其中一个服务无法提供服务可能导致其它服务也死掉,比如:单点登录服务调用用户信息服务查询用户信息,由于用户信息服务无法提供服务导致单点登录服务一直等待,从而导致用户登录、用户退出功能无法使用,像这样由一个服务所引起的一连串的多个服务无法提供服务即是微服务的雪崩效应。
Spring Cloud Hystrix 是基于Netflix的开源框架Hystrix的整合,它实现了断路器、线程隔离、信号隔离等容错功能。
下图是Hystrix断路器示意图:
要在服务消费方添加hystrix。
使用Hystrix实现容错。
在Spring boot的启动类上添加@enableHystrix注解
8.Spring Cloud Feign
Spring Cloud Feign 它基于Netflix Feign实现,整合了Ribbon 与Hystrix,除了提供者两者的功能之外,它还提供了一种声明式的Web服务客户端调用方式,只需创建一个接口,并用注解的方式来配置它,即可完成对服务提供方的接口绑定
在启动类中加@EnableFeignClients
服务提供方抽取出接口,单独打包
在服务提供方(demo-user-service)和服务消费方(demo-feign-consumer) pom.xml里引入抽取的接口jar
服务提供方 实现接口 做业务逻辑处理
服务消费方只需继续接口 并添加注解 @FeignClient 指定调用的服务名
9.非springCloud项目调用微服务
Feign是spring cloud中服务消费端的调用框架,在springCoud项目中需引入
在jeecg项目中引入 netflix公司的原生jar
首先创建调用的服务接口 通过@RequestLine指定HTTP协议及URL地址 加入@Headers注解,指定Content-Type为json
自定义工具类:
通过FeignUtil 工具类得到服务接口,直接调用响应方法
微服务提供方实现
10.Spring Cloud Zuul
服务网关是在微服务前边设置一道屏障,是对外提供服务的统一入口,请求先到服务网关,网关会对请求进行过虑、校验、路由等处理。有了服务网关可以提高微服务的安全性,校验不通过的请求将被拒绝访问。
Spring Cloud Zuul是整合Netflix公司的Zuul开源项目实现的微服务网关,它实现了请求路由、负载均衡、校验过虑等 功能。
1、部署用户信息服务A、单点登录服务B
2、将用户信息服务A、单点登录服务B注册到EurekaServer中。
3、开发并部署zuul。
在zuul中配置路由规则
在spring boot的启动类中配置注解
根据上边的路由配置访问微服务。
http://localhost:9001/sso/login/sun/123456
凡是以/sso/打头的请求,路由到 demo-ribbon-consumer微服务。
zuul网关,不仅提供对外服务访问 ,微服务也可以通过zuul请求其它的微服务。
zuul可以定义filter,需要继承ZuulFilter,进行校验拦截、过滤、异常处理等。
11.Spring Cloud Config
Spring cloud config 是spring cloud团队创建的一个全新项目,用来为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持,他分为服务端与客户端两部分。其中服务端也称为分布式配置中心,它是一个独立的微服务应用,用来连接配置仓库并为客户端提供获取配置信息、加密/解密等访问接口,而客户端则是微服务架构中的各个微服务应用,他们通过制定的配置中心来管理应用资源与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息。Spring cloud config实现的配置中心默认采用Git来存储配置信息,可以通过GIt客户端工具来方便地管理和访问配置内容。还支持Svn仓库,本地化文件系统
1创建一个基础的SpringBoot工程,并在pom.xml引入依赖
2.创建启动类 并添加@EnableConfigServer注解,开启spring cloud config的服务端功能
3.在yml配置文件中添加配置服务的基本信息以及git仓库的相关信息
4.客户端配置
上面这些属性必须配置在bootstrap.yml中,这样config-server中的配置信息才能被正确加载
bootstrap.yml用来程序引导时执行,应用于更加早期配置信息读取,如可以使用来配置application.yml中使用到参数等
application.yml应用程序特有配置信息,可以用来配置后续各个模块中需使用的公共参数等。
bootstrap.yml 先于 application.yml 加载
当使用 Spring Cloud 的时候,配置信息一般是从 config server 加载的,为了取得配置信息(比如密码等),你需要一些提早的或引导配置。因此,把 config server 信息放在 bootstrap.yml,用来加载真正需要的配置信息。
Config Server 通过git clone 将配置信息存于本地,起到了缓存的作用,git服务端无法访问时,依然可以去Config Server中的缓存内容进行使用
本地开发可以在yml文件里设置属性
spring.profiles.active=native
Config Server会默认从应用的src/main/resource 目录下搜索配置文件