• 微服务架构是一个分布式系统,按照业务进行划分成为不同的服务单元,解决单体系统性能等不足。
  • 微服务是一种架构风格,一个大型软件应用由多个服务单元组成。系统中的服务单元可以单独部署,各个服务单元之间是松耦合的。
  • Eureka 服务发现框架
  • Ribbon 进程内负载均衡器
  • Open Feign 服务调用映射
  • Hystrix 服务降级熔断器
  • Zuul 微服务网关
  • Config 微服务统一配置中心
  • Bus 消息总线

微服务之间是如何独立通讯的

同步

REST HTTP 协议

REST 请求在微服务中是最为常用的一种通讯方式,它依赖于 HTTP\HTTPS 协议。RESTFUL 的特点是:

  1. 每一个 URI 代表 1 种资源
  2. 客户端使用 GET、POST、PUT、DELETE 4 个表示操作方式的动词对服务端资源进行操作:GET 用来获取资源,POST 用来新建资源(也可以用于更新资源),PUT 用来更新资源,DELETE 用来删除资源
  3. 通过操作资源的表现形式来操作资源
  4. 资源的表现形式是 XML 或者 HTML
  5. 客户端与服务端之间的交互在请求之间是无状态的,从客户端到服务端的每个请求都必须包含理解请求所必需的信息

举个例子,有一个服务方提供了如下接口:

@RestController
@RequestMapping("/communication")
public class RestControllerDemo {
    @GetMapping("/hello")
    public String s() {
        return "hello";
    }
}

另外一个服务需要去调用该接口,调用方只需要根据 API 文档发送请求即可获取返回结果。

@RestController
@RequestMapping("/demo")
public class RestDemo{
    @Autowired
    RestTemplate restTemplate;

    @GetMapping("/hello2")
    public String s2() {
        String forObject = restTemplate.getForObject("http://localhost:9013/communication/hello", String.class);
        return forObject;
    }
}

RPC TCP 协议

RPC(Remote Procedure Call)远程过程调用,简单的理解是一个节点请求另一个节点提供的服务。它的工作流程是这样的:

  1. 服务消费方(client)调用以本地调用方式调用服务;
  1. client stub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体;
  2. client stub找到服务地址,并将消息发送到服务端;
  3. server stub收到消息后进行解码;
  4. server stub根据解码结果调用本地的服务;
  5. 本地服务执行并将结果返回给server stub;
  6. server stub将返回结果打包成消息并发送至消费方;
  7. client stub接收到消息,并进行解码;
  8. 服务消费方得到最终结果。

 

服务的注册和发现

解决问题:集中管理服务

解决方法:

  • Eureka
  • Zookeeper

负载均衡

解决问题:降低服务器硬件压力

解决方法:

  • Nginx
  • Ribbon

通讯

解决问题:各个服务之间的沟通桥梁

解决方法:

  • REST(同步)
  • RPC(同步)
  • MQ(异步)

配置管理

解决问题:随着服务的增加配置也在增加,如何管理各个服务的配置。

解决方法:

  • Nacos
  • Spring Cloud Config
  • Apollo

容错和服务降级

解决问题:在微服务当中,一个请求经常会涉及到调用几个服务,如果其中某个服务不可以,没有做服务容错的话,极有可能会造成一连串的服务不可用,这就是雪崩效应。

解决方法:

  • Hystrix