微服务架构样式就是把一个单体项目拆分为多个微小的服务,每个微服务可以在自己的进程中运行并与HTTP资源API进行通信。围业务功能进行构建,独立技术选型,独立开发,独立部署,独立运维,并且多个服务相互协调,相互配合,最终完成用户的价值;
微服务与单体项目的区别:
1.单体架构所有的模块全都耦合在一块,代码量大,维护困难,微服务每个模块就相当于一个单独的项目,代码量明显减少,遇到问题也相对来说比较好解决。
2.单体架构所有的模块都共用一个数据库,存储方式比较单一,微服务每个模块都可以使用不同的存储方式(比如有的用redis,有的用mysql等),数据库也是单个模块对应自己的数据库。
3.单体架构所有的模块开发所使用的技术一样,微服务每个模块都可以使用不同的开发技术,开发模式更灵活。
1. SpringCloud简介注:
微服务架构只是一个样式,一种风格;
可以将一个项目,拆分成多个模块去开发;
每一个模块都是单独运行在自己的容器中的;
每个模块需要相互通讯(HTTP、MQ);
每一个模块之间没有依赖关系,都是单独部署;
可以使用多种语言去开发不同模块;
将复杂的单体应用进行细粒度的划分,每个拆分出来的服务各自打包并且部署;
SpringCloud是一个基于Spring Boot实现的服务治理工具包,在微服务架构中用于管理和协调服务;
本文包含七个技术点:
Eureka:服务的注册发现
Robbin:服务之间的负载均衡
Feign:服务之间的通讯
Hystrix:服务 线程隔离以及断路器
Config:动态配置
Eureka是服务的注册与发现,便于服务之间的相互调用,用于任何需要注册的场景;基于REST的服务,由两个组件组成:Eureka服务器和Eureka客户端;
首先搞清楚EurekaServer担任注册中心职责:
- 管理服务的注册
- 搜索服务
- 向调用者提供服务清单
- 监听服务状态,动态更新服务列表
注册执行的步骤:
启动Eurekaserver
启动Provider-server(生产者启动)
向注册中心注册服务
EurekaServer登记注册的服务,维护一个服务列表
启动Consumer-server(消费者启动 ),同时向注册中心注册滋生服务
EurekaServer登记注册的服务,维护一个服务列表
Consumer-server搜索服务
如果有,向Consumer-server返回一个服务清单
从服务清单中选择一个服务,获取服务的地址
Consumer-server调用具体的服务(Producer-server)
Producer-server返回响应服务结果
EurekaServer通过心跳来检验Producer-server或者Consumer-server是否挂掉,默认情况下每30秒向注册中心的服务发送一次心跳,有响应表示存活;没有响应,隔60秒再次发送,还是没有响应;隔90秒再次发送一次请求;三次都没有响应就标记为不可达,需要使用时应该再次注册服务;
有两个EurekaService时应该互相注册,在第一个注册中心注册,注册不到在向下一个EurekaService中注册,直到注册成功(共同维护一份清单,只能在一份中看到清单);
Eureka心跳
EurekaClient启动是将自己的信息注册到EurekaServer上,EurekaServer就会存储上EurekaClient的注册信息;当EurekaClient调用服务时,本地没有缓冲信息时就回去EurekaServer中获取注册信息;EurekaClient会通过心跳的方式和EurekaServer进行连接;
3. Robbin服务间的负载均衡Eureka的自我保护机制:
- 15分钟内如果一个服务的心跳发送低于85%,EurekaServer就会开启保护机制;
- 不会从EurekaServer中移除长时间没有收到心跳的服务;
- 网络稳定时,EurekaServer才会开始将自己的信息被其他节点同步过去;
但是实际环境中,我们往往会开启很多个user-service的集群。此时我们获取的服务列表中就会有多个,这种情况下我们就需要编写负载均衡算法,在多个实例列表中进行选择;就有了负载均衡组件:Ribbon;
Robbin帮助我们实现服务间的负载均衡,属于客户端的负载均衡,一般配合Eureka进行使用;
客户端负载均衡:将Search模块全部拉取到本地缓冲,在customer中自己做一个负载均衡策略,选中某一服务;
服务端负载均衡:在注册中心中根据指定对的负载均衡策略,选中一个指定的服务信息返回;
Robbin配置负载均衡策略
4. Feign服务间的调用负载均衡策略:
- RandomRule:随机策略;
- RoundRobbinRule:轮询策略;
- WeightedResponseTimeRule:默认采用轮询策略,后续会根据服务的响应时间自动分配权重;
- BestAvailableRule:根据被调用方并发数量最小的去分配;
Feign可以帮助我们实现面向接口编程,它使得写Http客户端变得更简单;使用Feign只需要创建一个接口并注解。它具有可插拔的注解特性,可使用Feign注解和JAX-RS注解。Feign默认集成了Ribbon和Eureka结合实现了负载均衡的效果;
- Feign 采用的是基于接口的注解
- Feign 整合了ribbon
Feign的传递参数方式
传递的参数复杂时,默认采用POST的请求方式
传递单个参数时,使用@PathVariable,如传递参数较多时可以采用@RequestParam,不省略value属性;
传递对象信息时,统一采用json的方式,添加@RequestBody
式
传递单个参数时,使用@PathVariable,如传递参数较多时可以采用@RequestParam,不省略value属性;
传递对象信息时,统一采用json的方式,添加@RequestBody
Client接口必须采用@RequestMapping



