微服务架构发展史

单体架构

image.png

业务垂直划分

image.png

集群-负载均衡

image.png

SOA架构

image.png

微服务架构时代

(1)微服务架构就是开发的一个独立的系统,只不过这个独立系统通过一系列小的服务组成
(2)每个服务都会是一个独立的进程
(3)每个服务之间要进行调用,并且调用的方式是轻量级的通信机制,比如像Http协议
(4)这些服务通常会采用自动化的运维机制: CICD Continuous Intergration Continuous Delivery DevOps
(5)这些服务是去中心化的
(6)这些服务可以使用不同的编程语言来完成
(7)可以采用不同的数据存储技术

单体架构和微服务架构的比较

单体架构

优势:所有功能代码都是部署在一个war包,方便部署与测试
劣势:
(1)开发效率
(2)代码维护难
(3)扩展性也比较低
(4)如果挂了,就会没办法给用户提供功能

微服务架构

优势:
独立性、技术栈比较灵活、数据库的选择比较灵活、团队高效等
劣势:
额外一些工作[DDD领域驱动设计]、数据一致性

微服务架构需要解决的问题

image.png
(1)服务调用
(2)负载均衡
(3)服务调用失败,容错机制:立即返回?等待?过一会时间再访问?
(4)网关
(5)事务
(6) ……
SpringCloud基础以及基础组件的使用 - 图6
左边是SpringCloud团队做了接口以及实现类,右边是不同的厂商对于规范做了对应的实现。

服务的注册与发现

配置统一的版本管理

  1. <dependencyManagement>
  2. <dependencies>
  3. <dependency>
  4. <groupId>org.springframework.cloud</groupId>
  5. <artifactId>spring-cloud-dependencies</artifactId>
  6. <version>Hoxton.SR12</version>
  7. <type>pom</type>
  8. <scope>import</scope>
  9. </dependency>
  10. <dependency>
  11. <groupId>org.springframework.cloud</groupId>
  12. <artifactId>spring-cloud-alibaba-dependencies</artifactId>
  13. <version>0.9.0.RELEASE</version>
  14. <type>pom</type>
  15. <scope>import</scope>
  16. </dependency>
  17. <dependency>
  18. <groupId>org.springframework.cloud</groupId>
  19. <artifactId>spring-cloud-netflix-dependencies</artifactId>
  20. <version>2.2.9.RELEASE</version>
  21. <type>pom</type>
  22. <scope>import</scope>
  23. </dependency>
  24. </dependencies>
  25. </dependencyManagement>

基于SpringCloud Netflix Eureka作为注册中心

基于Nacos进行服务的注册与发现

1、引入依赖

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>
  4. </dependency>

2、配置Nacos注册中心

  1. spring:
  2. cloud:
  3. nacos:
  4. discovery:
  5. #指定nacos-server所在的地址
  6. server-addr: localhost:8848
  7. application:
  8. name: order-service

3、启动子服务即可在日志以及Nacos控制台看到已经成功注册服务

默认的用户名和密码是nacos。

4、使用Ribbon做负载均衡

  1. @Resource
  2. private LoadBalancerClient loadBalancerclient;

注解的方式使用Ribbon的负载均衡
  1. @Bean
  2. @LoadBalanced //表示该RestTemplate就具备了ribbon能力
  3. public RestTemplate restTemplateRibbon(){
  4. return new RestTemplate();
  5. }

基于Zookeeper作为服务的注册中心

服务调用组件之OpenFeign

引入依赖

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-openfeign</artifactId>
  4. </dependency>

主类添加注解

  1. @EnableFeignClients

定义服务中远程调用的接口

  1. import org.springframework.cloud.openfeign.Feignclient;
  2. import org.springframework.web.bind.annotation.RequestMapping;
  3. @Feignclient(name = "order-service")
  4. public interface OrderServiceFeignclient{
  5. RequestMapping("/order/query")
  6. string query();
  7. }

在业务类中进行依赖注入即可使用

定义一些Feign的配置

通过JavaConfig

通过yaml文件配置

  1. # feign的日志级别FULL
  2. feign:
  3. client:
  4. config:
  5. #feign调用的服务名称
  6. order-service:
  7. loggerLevel: full
  8. logging:
  9. level:
  10. com.fcant.userservice.openfeign: debug

配置中心

Nacos作为配置中心

1、引入Nacos Config包

  1. <dependency>
  2. <groupId>com.alibaba.cloud</groupId>
  3. <artifactId>spring-cloud-alibaba-nacos-config</artifactId>
  4. </dependency>
  5. <!--使bootstrap.yaml文件生效-->
  6. <dependency>
  7. <groupId>org.springframework.cloud</groupId>
  8. <artifactId>spring-cloud-context</artifactId>
  9. </dependency>

2、在Nacos Web端添加配置文件

创建一个名称为user-service-dev.yaml的配置文件

  1. person:
  2. username: Fcant

3、在服务中配置选择对应的配置文件

创建bootstrap.yaml文件,添加主要的配置内容

  1. spring:
  2. cloud:
  3. nacos:
  4. config:
  5. server-addr: localhost:8848
  6. file-extension: yaml
  7. application:
  8. #对应user-service-dev.yaml中的user-service
  9. name : user-service
  10. #配置激活的环境,即文件名后缀-dev
  11. profiles:
  12. active: dev

4、在对应读取配置文件的Bean上面添加@RefreshScope注解

  1. @RestController
  2. @RequestMapping("/user")
  3. @RefreshScope
  4. public class UserController {
  5. @Value("${person.username}")
  6. private String personUsername;
  7. @RequestMapping("/readnacosconfig")
  8. public String readNacosConfig(){
  9. return this.personUsername;
  10. }
  11. }

Spring Cloud Config作为配置中心

服务保护

  • 限流
  • 降级

    SpringCloud Alibaba Sentinel

    1、导入依赖

    1. <dependency>
    2. <groupId>com.alibaba.cloud</groupId>
    3. <artifactId>spring-cloud-alibaba-sentinel</artifactId>
    4. </dependency>

    2、配置

    1. spring:
    2. cloud :
    3. nacos:
    4. discovery:
    5. server-addr: localhost:8848
    6. sentinel:
    7. transport:
    8. #配置sentinel-server所在的地址
    9. dashboard: localhost:8080

    3、服务的接口以及监控管理

    :::tips 注意:服务启动成功后,并不能看到对应的服务名,因为Sentinel是懒加载的,所以只有通过访问的请求,才能在Web端查看到。 :::

    SpringCloud Netflix Hystrix

    消息中间件的整合

    Kafka

    Pulsar

    ActiveMQ

    RocketMQ

    官网:https://rocketmq.apache.org/

    1、RocketMQ安装部署启动

    Window上需要先添加RocketMQ安装包的环境变量
    1. start mqnamesrv.cmd
    2. start mqbroker.cmd -n 127.0.0.1:9876 autoCreateTopicEnab1e=true

    2、RocketMQ Web管理控制台

    https://github.com/apache/rocketmq-dashboard
    如果启动端口冲突则需要修改配置

    3、服务中整合RocketMQ的依赖

    1. <dependency>
    2. <groupId>org.apache.rocketmq</groupId>
    3. <artifactId>rocketmq-spring-boot-starter</artifactId>
    4. <version>2.2.0</version>
    5. </dependency>

    4、配置broker以及服务对应的producer

    1. # rocket-server的配置
    2. rocketmq:
    3. name-server: 127.0.0.1:9876
    4. producer:
    5. group: fcant-producer

    5、生产消息示例

    ```java @Resource RocketMQTemplate rocketMQTemplate;

@RequestMapping(“/produce”) public void produce() { rocketMQTemplate.convertAndSend(“user-service-topic”, “Hello World”); }

  1. <a name="DDDQi"></a>
  2. #### 6、消费者服务配置RocketMQ Server
  3. ```yaml
  4. # rocket-server的配置
  5. rocketmq:
  6. name-server: 127.0.0.1:9876

7、消费者消费消息

  1. import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
  2. import org.apache.rocketmq.spring.core.RocketMQListener;
  3. import org.springframework.stereotype.Service;
  4. /**
  5. * ConsumerListener
  6. * <p>
  7. * encoding:UTF-8
  8. *
  9. * @author Fcant 上午 10:41 2021/9/5/0005
  10. */
  11. @Service
  12. @RocketMQMessageListener(consumerGroup = "fcant-consumer",topic = "user-service-topic")
  13. public class ConsumerListener implements RocketMQListener<String> {
  14. @Override
  15. public void onMessage(String s) {
  16. System.out.println("Get Message: " + s);
  17. }
  18. }

微服务网关

SpringCloud Netflix Zuul第一代网关

Zuul网关采取的是BIO(同步阻塞IO),new ServerSocket(8090);

SpringCloud GateWay第二代网关

GateWay采取的是NIO(同步非阻塞IO),new ServerSocketChannel(8090);,GateWay更适合高并发的场景。
网关可以做的事:

  1. 服务的发现以及自定义
  2. 熔断
  3. 负载均衡
  4. 限流
  5. 认证授权

    1、创建GateWay网关模块

    2、引入GateWay依赖(这里的注册中心还是Nacos)

    1. <dependency>
    2. <groupId>org.springframework.cloud</groupId>
    3. <artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>
    4. </dependency>
    5. <dependency>
    6. <groupId>org.springframework.cloud</groupId>
    7. <artifactId>spring-cloud-starter-gateway</artifactId>
    8. </dependency>

    3、配置yaml

    1. server:
    2. port: 8090
    3. spring:
    4. cloud :
    5. nacos:
    6. discovery:
    7. server-addr: localhost:8848
    8. gateway:
    9. discovery:
    10. # 开启网关服务发现能力
    11. locator:
    12. enabled: true
    13. application:
    14. name: my-gateway

    4、自定义配置路由规则

    1. spring:
    2. cloud:
    3. nacos:
    4. discovery:
    5. server-addr: localhost:8848
    6. gateway:
    7. discovery:
    8. locator:
    9. #开启网关服务发现的能力
    10. enabled: true
    11. #自定义的路由规则
    12. routes:
    13. #路由匹配的条件
    14. - predicates:
    15. - Path=/fcant/**
    16. filters:
    17. #表示过滤器进行操作
    18. - StripPrefix=1
    19. uri: http://localhost:8081

    链路追踪

    把微服务的调用关系记录下来,方便后期问题排查。

    SpringCloud Sleuth(可视化界面使用zipkin)

    默认的采样率为10%,即调用十次,记录一次。

    1、引入依赖

    在需要进行链路追踪的模块里面引入依赖,zipkin已经包含了sleuth的依赖
    1. <dependency>
    2. <groupId>org.springframework.cloud</groupId>
    3. <artifactId>spring-cloud-starter-zipkin</artifactId>
    4. </dependency>

    2、服务模块配置zipkin

    这里设置采用率为百分之百,方便进行观察。默认0.1。
    1. spring:
    2. zipkin:
    3. base-url: http:localhost:9411
    4. sleuth:
    5. sampler:
    6. probability: 1.0

    SkyWalking(用的比较多)

    阿里鹰眼

    大众点评Cat

    分布式事务

    SEATA