微服务架构发展史
单体架构
业务垂直划分
集群-负载均衡
SOA架构
微服务架构时代
(1)微服务架构就是开发的一个独立的系统,只不过这个独立系统通过一系列小的服务组成
(2)每个服务都会是一个独立的进程
(3)每个服务之间要进行调用,并且调用的方式是轻量级的通信机制,比如像Http协议
(4)这些服务通常会采用自动化的运维机制: CICD Continuous Intergration Continuous Delivery DevOps
(5)这些服务是去中心化的
(6)这些服务可以使用不同的编程语言来完成
(7)可以采用不同的数据存储技术
单体架构和微服务架构的比较
单体架构
优势:所有功能代码都是部署在一个war包,方便部署与测试
劣势:
(1)开发效率
(2)代码维护难
(3)扩展性也比较低
(4)如果挂了,就会没办法给用户提供功能
微服务架构
优势:
独立性、技术栈比较灵活、数据库的选择比较灵活、团队高效等
劣势:
额外一些工作[DDD领域驱动设计]、数据一致性
微服务架构需要解决的问题

(1)服务调用
(2)负载均衡
(3)服务调用失败,容错机制:立即返回?等待?过一会时间再访问?
(4)网关
(5)事务
(6) ……
左边是SpringCloud团队做了接口以及实现类,右边是不同的厂商对于规范做了对应的实现。
服务的注册与发现
配置统一的版本管理
<dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Hoxton.SR12</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>0.9.0.RELEASE</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-netflix-dependencies</artifactId><version>2.2.9.RELEASE</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>
基于SpringCloud Netflix Eureka作为注册中心
基于Nacos进行服务的注册与发现
1、引入依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-alibaba-nacos-discovery</artifactId></dependency>
2、配置Nacos注册中心
spring:cloud:nacos:discovery:#指定nacos-server所在的地址server-addr: localhost:8848application:name: order-service
3、启动子服务即可在日志以及Nacos控制台看到已经成功注册服务
4、使用Ribbon做负载均衡
@Resourceprivate LoadBalancerClient loadBalancerclient;
注解的方式使用Ribbon的负载均衡
@Bean@LoadBalanced //表示该RestTemplate就具备了ribbon能力public RestTemplate restTemplateRibbon(){return new RestTemplate();}
基于Zookeeper作为服务的注册中心
服务调用组件之OpenFeign
引入依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>
主类添加注解
@EnableFeignClients
定义服务中远程调用的接口
import org.springframework.cloud.openfeign.Feignclient;import org.springframework.web.bind.annotation.RequestMapping;@Feignclient(name = "order-service")public interface OrderServiceFeignclient{RequestMapping("/order/query")string query();}
在业务类中进行依赖注入即可使用
定义一些Feign的配置
通过JavaConfig
通过yaml文件配置
# feign的日志级别FULLfeign:client:config:#feign调用的服务名称order-service:loggerLevel: fulllogging:level:com.fcant.userservice.openfeign: debug
配置中心
Nacos作为配置中心
1、引入Nacos Config包
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-nacos-config</artifactId></dependency><!--使bootstrap.yaml文件生效--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-context</artifactId></dependency>
2、在Nacos Web端添加配置文件
创建一个名称为user-service-dev.yaml的配置文件
person:username: Fcant
3、在服务中配置选择对应的配置文件
创建bootstrap.yaml文件,添加主要的配置内容
spring:cloud:nacos:config:server-addr: localhost:8848file-extension: yamlapplication:#对应user-service-dev.yaml中的user-servicename : user-service#配置激活的环境,即文件名后缀-devprofiles:active: dev
4、在对应读取配置文件的Bean上面添加@RefreshScope注解
@RestController@RequestMapping("/user")@RefreshScopepublic class UserController {@Value("${person.username}")private String personUsername;@RequestMapping("/readnacosconfig")public String readNacosConfig(){return this.personUsername;}}
Spring Cloud Config作为配置中心
服务保护
- 限流
- 降级
SpringCloud Alibaba Sentinel
1、导入依赖
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-sentinel</artifactId></dependency>
2、配置
spring:cloud :nacos:discovery:server-addr: localhost:8848sentinel:transport:#配置sentinel-server所在的地址dashboard: localhost:8080
3、服务的接口以及监控管理
:::tips 注意:服务启动成功后,并不能看到对应的服务名,因为Sentinel是懒加载的,所以只有通过访问的请求,才能在Web端查看到。 :::SpringCloud Netflix Hystrix
消息中间件的整合
Kafka
Pulsar
ActiveMQ
RocketMQ
官网:https://rocketmq.apache.org/1、RocketMQ安装部署启动
Window上需要先添加RocketMQ安装包的环境变量start mqnamesrv.cmdstart mqbroker.cmd -n 127.0.0.1:9876 autoCreateTopicEnab1e=true
2、RocketMQ Web管理控制台
https://github.com/apache/rocketmq-dashboard
如果启动端口冲突则需要修改配置3、服务中整合RocketMQ的依赖
<dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.2.0</version></dependency>
4、配置broker以及服务对应的producer
# rocket-server的配置rocketmq:name-server: 127.0.0.1:9876producer:group: fcant-producer
5、生产消息示例
```java @Resource RocketMQTemplate rocketMQTemplate;
@RequestMapping(“/produce”) public void produce() { rocketMQTemplate.convertAndSend(“user-service-topic”, “Hello World”); }
<a name="DDDQi"></a>#### 6、消费者服务配置RocketMQ Server```yaml# rocket-server的配置rocketmq:name-server: 127.0.0.1:9876
7、消费者消费消息
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;import org.apache.rocketmq.spring.core.RocketMQListener;import org.springframework.stereotype.Service;/*** ConsumerListener* <p>* encoding:UTF-8** @author Fcant 上午 10:41 2021/9/5/0005*/@Service@RocketMQMessageListener(consumerGroup = "fcant-consumer",topic = "user-service-topic")public class ConsumerListener implements RocketMQListener<String> {@Overridepublic void onMessage(String s) {System.out.println("Get Message: " + s);}}
微服务网关
SpringCloud Netflix Zuul第一代网关
Zuul网关采取的是BIO(同步阻塞IO),new ServerSocket(8090);
SpringCloud GateWay第二代网关
GateWay采取的是NIO(同步非阻塞IO),new ServerSocketChannel(8090);,GateWay更适合高并发的场景。
网关可以做的事:
- 服务的发现以及自定义
- 熔断
- 负载均衡
- 限流
- 认证授权
1、创建GateWay网关模块
2、引入GateWay依赖(这里的注册中心还是Nacos)
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency>
3、配置yaml
server:port: 8090spring:cloud :nacos:discovery:server-addr: localhost:8848gateway:discovery:# 开启网关服务发现能力locator:enabled: trueapplication:name: my-gateway
4、自定义配置路由规则
spring:cloud:nacos:discovery:server-addr: localhost:8848gateway:discovery:locator:#开启网关服务发现的能力enabled: true#自定义的路由规则routes:#路由匹配的条件- predicates:- Path=/fcant/**filters:#表示过滤器进行操作- StripPrefix=1uri: http://localhost:8081
链路追踪
把微服务的调用关系记录下来,方便后期问题排查。SpringCloud Sleuth(可视化界面使用zipkin)
默认的采样率为10%,即调用十次,记录一次。1、引入依赖
在需要进行链路追踪的模块里面引入依赖,zipkin已经包含了sleuth的依赖<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-zipkin</artifactId></dependency>
2、服务模块配置zipkin
这里设置采用率为百分之百,方便进行观察。默认0.1。spring:zipkin:base-url: http:localhost:9411sleuth:sampler:probability: 1.0
SkyWalking(用的比较多)
阿里鹰眼
大众点评Cat
分布式事务
SEATA
