微服务结构及微服务远程调用

Posted 夏志121

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了微服务结构及微服务远程调用相关的知识,希望对你有一定的参考价值。

目录

一、微服务结构

二、微服务远程调用


一、微服务结构

        微服务这种方案需要技术框架来落地,全球的互联网公司都在积极尝试自己的微服务落地技术。在国内最知名的就是SpringCloud和阿里巴巴的Dubbo

 微服务技术对比:

DubboSpringCloudSpringCloudAlibaba
注册中心zookeeper、RedisEureka、ConsulNacos、Eureka
服务远程调用Dubbo协议Feign (http协议)Dubbo、Feign
配置中心SpringCloudfigSpringCloudfig、Nacos
服务网关SpringCloudGateway、ZuulSpringCloudGateway、Zuul
服务监控保护dubbo-admin、功能弱HystixSentinel

二、微服务远程调用

根据订单id查询订单功能:

需求:根据订单id查询订单的同时,把订单所属的用户信息一起返回

 实现步骤:

1、注册RestTemplate

order-serviceOrderApplication中注册RestTemplate

@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
public class OrderApplication 

    public static void main(String[] args) 
        SpringApplication.run(OrderApplication.class, args);
    

    /**
     * 创建RestTemplate并注入Spring容器
     * @return
     */
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate()
        return new RestTemplate();
    

2、服务远程调用RestTemplate

修改order-service中的OrderServicequeryOrderById方法:

@Service
public class OrderService 

    @Autowired
    private OrderMapper orderMapper;

    @Autowired
    private RestTemplate restTemplate;

    public Order queryOrderById(Long orderId) 
        // 1.查询订单
        Order order = orderMapper.findById(orderId);
        //2、利用RestTemplate发送http,查询用户
        //2.1 url路径
        String url = "http://localhost:8081/user/"+order.getUserId();
        //2。1 发送http请求,实现远程调用
        User user = restTemplate.getForObject(url,User.class);
        //3.封装user到Order
        order.setUser(user);
        // 4.返回
        return order;
    

微服务调用方式:

基于RestTemplate发起的http请求实现远程调用

http请求做远程调用时与语言无关的调用,只要知道对方的ip、端口、接口路径、请求参数即可

提供者及消费者:

服务提供者:一次业务中,被其他微服务调用的服务(提供接口给其他微服务)

服务消费者:一次业务中,调用其他微服务的服务 (调用其他的微服务提供的接口)

服务调用关系:

服务提供者:暴露接口给其他微服务调用

服务消费者:调用其他微服务提供的接口

提供者与消费者角色是相对

一个服务可以同时是服务提供者和服务消费者

洞见云原生|微服务及微服务架构浅析

前言

2014年Martin Fowler正式提出了“微服务”的概念:微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。每个服务运行在其独立的进程中,服务和服务间采用轻量级的通信机制互相沟通(通常是基于 HTTP 的 RESTful API)。每个服务都围绕着具体业务进行构建,并且能够被独立地部署到生产环境、类生产环境等。另外,应尽量避免统一的、集中式的服务管理机制,对具体的一个服务而言,应根据业务上下 文,选择合适的语言、工具对其进行构建。

 Martin Fowler,软件开发领域教父级人物,ThoughtWorks首席科学家,著有《重构:改善既有代码的设计》《分析模式:可复用的对象模型》《领域特定语言》《企业应用架构模式》等经典著作,敏捷开发方法论开创者,微服务概念提出者


一、单体架构与微服务架构

1、单体架构

一个单体系统是一个大而全的功能集合,每个服务器运行的是这个应用的完整服务。一个应用所有的功能都在一个工程项目里面,项目中的classes、jsp、css、js等前后端资源最终都归档为一个war包部署到服务器。

 单体架构的优点:

  • 开发、测试、部署都相对简单;
  • 技术架构简单。

单体架构的缺点:

  • 开发效率较低,开发人员往往需要了解整体业务功能
  • 维护成本高,可扩展性较差
  • 每次升级部署影响较大、所有服务都将不可用,牵一发而动全身
  • 技术选型成本高

2、微服务架构

微服务架构是相对单体应用而言的,基于“低耦合、高内聚”原则,根据实际业务功能将单体应用拆分成多个服务,每个服务提供特定的业务功能(单一职责原则),每个服务都可以单独部署,相互独立。

 微服务架构优点:

  • 各服务根据高内聚低耦合原则拆分,代码更加简单易于理解
  • 开发简单、只专注一个业务模块即可
  • 易于扩展
  • 前后端分离,易于部署

微服务架构缺点

  • 运维部署复杂度提升
  • 服务之间通过REST等方式互相调用,增加了通信成本
  • 拆分导致的其他问题:如数据一致性问题,分布式事务问题等

单体架构与微服务架构并没有谁好谁不好的问题,只有适合不适合的问题。如果业务相对比较稳定,发版周期较长,则比较适合单体架构。而微服务架构在应对需求的变化、容错处理、服务复用及扩展、提升开发效率、简化交互等方面都有明显的优势。同时,敏捷开发、DevOps、持续集成/持续交付、容器技术、Spring Cloud框架、轻量级服务、领域驱动设计等技术的涌现也使微服务架构成为解决复杂问题的灵丹妙药。

二、微服务架构解决方案有哪些?

  1. Spring Cloud:是一系列框架的有序集合,它利用Spring Boot的开发便利性巧妙地简化了分布式系统基 础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用 Spring Boot的开发风格做到一键启动和部署。

  2. Apache ServiceComb:是第一个 Apache 微服务项目, 是一个开源微服务解决方案,实现对微服务应用的高效运维管理。其提供一站式开源微服务解决方案,融合SDK框架级、0侵入ServiceMesh场景并支持多语言。

  3. ZeroC IceGrid:ZeroC公司的杰作,继承了CORBA的血统,是面向对象的分布式系统中间件。基于 RPC 框架发展而来,具有良好的性能与分布式能力。
  4. Motan:是开源的 RPC 框架,只支持 Java 语言实现,需要在 Client 端(服务消费者)和 Server 端(服务提供者)引入 SDK。
  5. Thrift:是一种轻量级的跨语言 RPC 通信方案,支持多达 25 种编程语言。Thrift 有一套自己的接口定义语言 IDL
  6. ......

总结

微服务架构选型中,我们要根据社区成熟度流行程度开发难度学习曲线、业务实际等多维因素考虑,微服务架构已在云原生架构中发挥着举足轻重的作用,而SpingCloud无疑是我们开发微服务的首选技术解决方案之一。

以上是关于微服务结构及微服务远程调用的主要内容,如果未能解决你的问题,请参考以下文章

洞见云原生|微服务及微服务架构浅析

SpringCloud系列SpringCloud概述及微服务技术栈的使用

微服务课程之SpringCloud 概述及微服务搭建

单一垂直分布式架构及微服务的优缺点

任何架构都离不开服务的拆分,微服务的拆分和远程调用你会吗?

ivx杨帆启航React/Pixi.js/FaaSKrpano及微服务架构