• 微服务技术栈-认识微服务和第一个微服务Demo



    前言

    随着业务的不断复杂,对服务的要求也越来越高,服务架构也从单体架构逐渐演变为现在流行的微服务架构。
    本章就从微服务架构演变开始讲起,并且介绍一系列微服务技术栈然后搭建一个自己的微服务demo。


    一、认识微服务

    单体架构:将业务的所有功能集中在一个项目中开发,打成一个包部署。
    优点:架构简单且部署成本低,打包成一个war包放在类似tomcat的容器中就可以运行。
    缺点:耦合度高(维护困难、升级困难)
    在这里插入图片描述

    分布式架构:根据业务功能对系统做拆分,每个业务功能模块作为独立项目开发,称为一个服务。
    优点:降低服务耦合,每个服务都是一个独立的模块,容易升级和扩展。
    缺点:服务调用关系错综复杂,增加了系统的复杂度。
    在这里插入图片描述

    分布式架构在服务拆分时需要考虑很多问题,例如:
    服务拆分的粒度:一个项目要怎么进行拆分?拆分完的服务要怎么互相调用?不同服务的调用关系要怎么处理。

    那么什么是微服务呢?微服务给分布式架构制定一个标准,进一步降低服务之间的耦合度,提供服务的独立性和灵活性。做到高内聚,低耦合。

    微服务的架构特征:业务拆分粒度更小(单一职责),独立部署交付,每个服务对外提供统一标准接口,服务之间相互隔离。

    SpringCloud是目前国内使用最广泛的微服务框架,集成了各种优秀微服务功能组件官网地址:https://spring.io/projects/spring-cloud


    二、微服务技术栈

    微服务技术栈不是只有SpringCloud,SpringClould仅仅是解决了服务拆分时的服务治理问题,一套完整的微服务技术栈应当包括如下:
    在这里插入图片描述
    1.服务网关:网关是介于客户端和服务器端之间的中间层,所有的外部请求都会先经过网关这一层,我们使用gateway这个网关技术,无缝衔接到基于spring cloud的微服务开发中来。
    2.服务集群:由多个不同的服务组成。
    3.注册中心:各微服务启动时,注册中心存储这些服务数据,目前主流的注册中心有Eureka和Nacos等。
    4.配置中心:配置是用来动态修改程序执行的一种行为的机制。
    5.分布式缓存:分布式缓存主要用于在高并发环境下,减轻数据库的压力,提高系统的响应速度和并发吞吐。
    6.分布式搜索:常见的搜索引擎有Elasticsearch,实现了高可用的分布式集群搜索方案。
    7.分布式日志服务:集中化的日志管理,分布式日志就是对大规模日志数据进行采集、追踪、处理。
    8.消息队列:具有削峰、异步、解耦的作用,常见的有rabbitmq、rocketmq、kafka。
    9.系统监控&链路追踪:掌控不同服务的情况,追踪服务之间的调用链路。

    CI(持续集成)技术栈
    1.Jenkins:Jenkins是一个用Java编写的开源的持续集成工具,Jenkins提供了软件开发的持续集成服务。
    2.Docker:docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
    3.K8s:在Docker技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性。
    4.Rancher:Rancher 是一个 Kubernetes 管理工具,让你能在任何地方和任何提供商上部署和运行集群。


    三、Eureka注册中心

    任何分布式架构都离不开服务的拆分,例如我们现在有一个小demo,现在拆分成以下两个服务。
    1.order-service:订单微服务(订单相关业务),表里存有用户的id,需要调用user-service查询用户信息。
    2.user-service:用户微服务,负责用户相关业务。
    这两个服务都有各自的数据库,对外以Restful形式暴露接口。
    在这里插入图片描述
    在服务调用关系中,会有两个不同的角色:
    服务提供者:一次业务中,被其它微服务调用的服务。(提供接口给其它微服务)
    服务消费者:一次业务中,调用其它微服务的服务。(调用其它微服务提供的接口)

    以上述demo为例,order-service就是服务的消费者,user-service就是服务的提供者。

    注意:服务提供者与服务消费者的角色并不是绝对的,而是相对于业务而言。一个服务既可以是服务提供者,也可以是服务消费者。

    了解完上述的demo后,我们会发现很多问题:
    1.order-service在发起远程调用的时候,该如何得知user-service实例的ip地址和端口?
    2.有多个user-service实例地址,order-service调用时该如何选择?
    3.order-service如何得知某个user-service实例是否依然健康,是不是已经宕机

    这些问题都需要利用SpringCloud中的注册中心来解决,其中最广为人知的注册中心就是Eureka。
    在这里插入图片描述
    了解并学习完Eureka的概念和作用后,上述问题便迎刃而解。
    1.user-service服务实例启动后,将自己的信息注册到eureka-server(服务注册),同时保存服务名称到服务实例地址列表的映射关系,order-service会根据服务名称,拉取实例地址列表(服务拉取)。

    2.order-service从实例列表中利用负载均衡算法选中一个实例地址,向该实例地址发起远程调用。

    3.user-service会每隔一段时间(默认30秒)向eureka-server发起请求,报告自己状态,称为心跳(心跳检测机制)。当超过一定时间没有发送心跳时,eureka-server会认为微服务实例故障,将该实例从服务列表中剔除。后面当order-service拉取服务时,就能将故障实例排除了。


    四、微服务DEMO

    1、搭建eureka-server

    1)在cloud-demo父工程下,创建一个子模块(eureka-server)。
    2)在eureka-server子工程中引入eureka服务端依赖。

    <dependency>
        <groupId>org.springframework.cloudgroupId>
        <artifactId>spring-cloud-starter-netflix-eureka-serverartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4

    3)给eureka-server服务编写启动类,添加一个@EnableEurekaServer注解,开启eureka的注册中心功能。

    package cn.itcast.eureka;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
    
    @SpringBootApplication
    @EnableEurekaServer
    public class EurekaApplication {
        public static void main(String[] args) {
            SpringApplication.run(EurekaApplication.class, args);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    4)编写配置文件,主要配置端口和服务名,以及eureka的地址

    server:
      port: 10086
    spring:
      application:
        name: eureka-server
    eureka:
      client:
        service-url: 
          defaultZone: http://127.0.0.1:10086/eureka
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    5)启动eureka微服务,直接浏览器访问http://127.0.0.1:10086
    在这里插入图片描述

    2、服务注册和服务发现

    搭建完注册中心后,就需要把服务注册到注册中心上面去。现在我们将user-service和order-service注册到eureka-server中去。
    1)引入依赖(服务发现、服务注册统一都封装在eureka-client依赖)

    <dependency>
        <groupId>org.springframework.cloudgroupId>
        <artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4

    2)配置文件(在user-service和order-service中,修改application.yml文件,添加服务名称、eureka地址)

    spring:
      application:
        name: userservice
    eureka:
      client:
        service-url:
          defaultZone: http://127.0.0.1:10086/eureka
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    3)服务拉取和负载均衡(从eureka-server中拉取user-service服务的实例列表,并且实现负载均衡)

    在order-service的OrderApplication中,给RestTemplate这个Bean添加一个@LoadBalanced注解:

    (RestTemplate是Spring支持的一个 HTTP 请求工具,它提供了常见的REST请求方案的模版,例如GET请求、POST请求、PUT请求、DELETE请求)

    @SpringBootApplication
    public class OrderApplication {
        public static void main(String[] args) {
            SpringApplication.run(OrderApplication.class, args);
        }
        @Bean
        @LoadBalanced
        public RestTemplate restTemplate(){
            return  new RestTemplate();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    4)修改order-service服务访问user-service的url路径,用服务名代替ip、端口:

    String url="http://userservice/user/"+order.getUserId()
    
    • 1

    spring会自动帮助我们从eureka-server端,根据userservice这个服务名称,获取实例列表,而后完成负载均衡。


    总结

    SpringCloud是微服务架构的一站式解决方案,集成了各种优秀微服务功能组件,同时要注意不能把微服务技术和SpringCloud画等号。在后续的文章中将介绍更多有关微服务技术栈的知识。


  • 相关阅读:
    【PMP考前冲刺题-第二小节(2022.7)】解析
    Git、Github、Gitee、GitLab学习笔记
    JAVA中的进制与位运算
    【ONNXRuntime】python找不到指定的模块:onnxruntime\capi\onnxruntime_providers_shared.dll
    【PCB绘制】Altium Designer 20 使用教程
    Java的日期与时间之java.time.LocalDateTime简介说明
    用 AWTK 和 AWPLC 快速开发嵌入式应用程序 (3)- 定时器
    【C】自定义类型(二)位段,枚举,联合
    PAT (甲级) 2022年秋季考试 c++ 满分题解
    25装饰器2
  • 原文地址:https://blog.csdn.net/qq_52173163/article/details/133501408