微服务基础与Spring Cloud框架

一、系统架构的演变

1.1单体应⽤架构

Web应⽤程序发展的早期,⼤部分web⼯程(包含前端⻚⾯,web层代码,service层代码,dao层代码)是将 所 有的功能模块,打包到⼀起并放在⼀个web容器中运⾏。

1.2 垂直应⽤架构

当访问量逐渐增⼤,单⼀应⽤增加机器带来的加速度越来越⼩,将应⽤拆成互不相⼲的⼏个应⽤,以提升效率

1.3 分布式SOA架构

1.3.1 什么是SOA?

SOA 全称为 Service-Oriented Architecture,即⾯向服务的架构。它可以根据需求通过⽹络对松散耦合 的粗粒度应⽤组件(服务)进⾏分布式部署、组合和使⽤。⼀个服务通常以独⽴的形式存在于操作系统进程中。

站在功能的⻆度,把业务逻辑抽象成可复⽤、可组装的服务,通过服务的编排实现业务的快速再⽣,⽬的:把原先固有的业务功能转变为通⽤的业务服务,实现业务逻辑的快速复⽤。

通过上⾯的描述可以发现 SOA 有如下⼏个特点:分布式、可重⽤、扩展灵活、松耦合

1.3.2 SOA架构

当垂直应⽤越来越多,应⽤之间交互不可避免,将核⼼业务抽取出来,作为独⽴的服务,逐渐形成稳定的服务中⼼,使前端应⽤能更快速的响应多变的市场需求

1.4 微服务架构

通过服务的原⼦化拆分,以及微服务的独⽴打包、部署和升级,⼩团队的交付周期将缩短,运维成 本也将⼤幅度下降 微服务遵循单⼀原则。微服务之间采⽤Restful等轻量协议传输。

1.5 SOA与微服务的关系

SOA( Service Oriented Architecture )"⾯向服务的架构":他是⼀种设计⽅法,其中包含多个服务, 服务之间通过相互依赖最终提供⼀系列的功能。 ⼀个服务通常以独⽴的形式存在与操作系统进程中。各 个服务之间通过⽹络调⽤。

微服务架构:其实和SOA 架构类似,微服务是在SOA上做的升华,微服务架构强调的⼀个重点是"业务需要 彻底的组件化和服务化" ,原有的单个业务系统会拆分为多个可以独⽴开发、设计、运⾏的⼩应⽤。 这些⼩应⽤之间通过服务完成交互和集成。

二、分布式核⼼知识

2.1 分布式中的远程调⽤

在微服务架构中,通常存在多个服务之间的远程调⽤的需求。远程调⽤通常包含两个部分:序列化和通信协议。常⻅的序列化协议包括json、xml、 hession、 protobuf、thrift、text、 bytes等,⽬前主流的远程调⽤技术有基于HTTP的RESTful接⼝以及基于TCP的RPC协议。

( 1 )RESTful接⼝

REST,即Representational State Transfer的缩写,如果⼀个架构符合REST原则,就称它为RESTful架构。

总结⼀下什么是RESTful架构:

每⼀个URI代表⼀种资源; 客户端和服务器之间,传递这种资源的某种表现层; 客户端通过四个HTTP动词,对服务器端资源进⾏操作,实现"表现层状态转化"。

( 2 )RPC协议 RPC( Remote Procedure Call )⼀种进程间通信⽅式。允许像调⽤本地服务⼀样调⽤远程服务。 RPC框架的主要⽬标就是让远程服务调⽤更简单、透明。 RPC框架负责屏蔽底层的传输⽅式(TCP或者 UDP)、序列化⽅式(XML/JSON/⼆进制)和通信细节。开发⼈员在使⽤的时候只需要了解谁在什么位 置提供了什么样的远程服务接⼝即可,并不需要关⼼底层通信细节和调⽤过程。

三、常⻅微服务框架

3.1Spring Cloud

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

3.2 ServiceComb

Apache ServiceComb是业界第⼀个Apache微服务顶级项⽬, 是⼀个开源微服务解决⽅案,致⼒于帮助 企业、⽤户和开发者将企业应⽤轻松微服务化上云,并实现对微服务应⽤的⾼效运维管理。其提供⼀站 式开源微服务解决⽅案,融合SDK框架级、 0侵⼊ServiceMesh场景并⽀持多语⾔。

3.3 ZeroC ICE

ZeroC IceGrid是ZeroC公司的杰作,继承了CORBA的⾎统,是新⼀代的⾯向对象的分布式系统中间件。 作为⼀种微服务架构,它基于RPC框架发展⽽来,具有良好的性能与分布式能⼒。

四、SpringCloud概述

4.1 服务注册与发现

服务注册:服务实例将⾃身服务信息注册到注册中⼼。这部分服务信息包括服务所在主机IP和提供服务 的Port ,以及暴露服务⾃身状态以及访问协议等信息。

服务发现:服务实例请求注册中⼼获取所依赖服务信息。服务实例通过注册中⼼,获取到注册到其中的 服务实例的信息,通过这些信息去请求它们提供的服务。

4.2 负载均衡

负载均衡是⾼可⽤⽹络基础架构的关键组件,通常⽤于将⼯作负载分布到多个服务器来提⾼⽹站、应 ⽤、数据库或其他服务的性能和可靠性。

4.3 熔断

熔断这⼀概念来源于电⼦⼯程中的断路器(Circuit Breaker)。在互联⽹系统中,当下游服务因访问压 ⼒过⼤⽽响应变慢或失败,上游服务为了保护系统整体的可⽤性,可以暂时切断对下游服务的调⽤。这 种牺牲局部,保全整体的措施就叫做熔断。

4.4 链路追踪

随着微服务架构的流⾏,服务按照不同的维度进⾏拆分,⼀次请求往往需要涉及到多个服务。互联⽹应 ⽤构建在不同的软件模块集上,这些软件模块,有可能是由不同的团队开发、可能使⽤不同的编程语⾔ 来实现、有可能布在了⼏千台服务器,横跨多个不同的数据中⼼。因此,就需要对⼀次请求涉及的多个 服务链路进⾏⽇志记录,性能监控即链路追踪

4.5 API⽹关

随着微服务的不断增多,不同的微服务⼀般会有不同的⽹络地址,⽽外部客户端可能需要调⽤多个服务 的接⼝才能完成⼀个业务需求,如果让客户端直接与各个微服务通信可能出现:

  • 客户端需要调⽤不同的url地址,增加难度
  • 再⼀定的场景下,存在跨域请求的问题
  • 每个微服务都需要进⾏单独的身份认证

针对这些问题,API⽹关顺势⽽⽣。

五、服务调⽤

5.1RestTemplate介绍

Spring框架提供的RestTemplate类可⽤于在应⽤中调⽤rest服务,它简化了与http服务的通信⽅式,统 ⼀了RESTful的标准,封装了http链接, 我们只需要传⼊url及返回值类型即可。相较于之前常⽤的 HttpClient ,RestTemplate是⼀种更优雅的调⽤RESTful服务的⽅式。

5.2通过RestTemplate调⽤微服务

( 1 )在 shop_order⼯程中配置RestTemplate

//配置RestTemplate交给spring管理

@Bean public RestTemplate getRestTemplate() { return new RestTemplate(); }

( 2 )编写下订单⽅法

//通过restTemplate调⽤商品微服务

restTemplate .getForObject("http://127.0.0.1:8081/product/1" , Product.class);

5.3 硬编码存在的问题

⾄此已经可以通过RestTemplate调⽤商品微服务的RESTFul API接⼝。但是我们把提供者的⽹络地址 (ip,端⼝)等硬编码到了代码中,这种做法存在许多问题:

  • 应⽤场景有局限
  • ⽆法动态调整

就需要通过注册中⼼动态的对服务注册和服务发现

六、微服务的注册中⼼

注册中⼼可以说是微服务架构中的"通讯录" ,它记录了服务和服务地址的映射关系。在分布式架构中, 服务会注册到这⾥,当服务需要调⽤其它服务时,就这⾥找到服务的地址,进⾏调⽤。

6.1 注册中⼼的主要作⽤

服务注册中⼼(下称注册中⼼)是微服务架构⾮常重要的⼀个组件,在微服务架构⾥主要起到了协调者的⼀个作⽤。注册中⼼⼀般包含如下⼏个功能:

  1. 服务发现:

服务注册/反注册:保存服务提供者和服务调⽤者的信息

服务订阅/取消订阅:服务调⽤者订阅服务提供者的信息,最好有实时推送的功能

服务路由(可选):具有筛选整合服务提供者的能⼒。

  1. 服务配置:

配置订阅:服务提供者和服务调⽤者订阅微服务相关的配置

配置下发:主动将配置推送给服务提供者和服务调⽤者

  1. 服务健康检测

检测服务提供者的健康情况

6.2 常⻅的注册中⼼

Zookeeper

zookeeper它是⼀个分布式服务框架,是Apache Hadoop 的⼀个⼦项⽬,它主要是⽤来解决分布式应 ⽤中经常遇到的⼀些数据管理问题,如:统⼀命名服务、状态同步服务、集群管理、分布式应⽤配置项 的管理等。简单来说zookeeper=⽂件系统+监听通知机制。

Eureka

Eureka是在Java语⾔上,基于Restful Api开发的服务注册与发现组件,Springcloud Netflix中的重要组件

Consul

Consul是由HashiCorp基于Go语⾔开发的⽀持多数据中⼼分布式⾼可⽤的服务发布和注册服务软件, 采 ⽤Raft算法保证服务的⼀致性,且⽀持健康检查。

Nacos

Nacos是⼀个更易于构建云原⽣应⽤的动态服务发现、配置管理和服务管理平台。简单来说 Nacos 就是 注册中⼼ + 配置中⼼的组合,提供简单易⽤的特性集,帮助我们解决微服务开发必会涉及到的服务注册 与发现,服务配置,服务管理等问题。 Nacos 还是 Spring Cloud Alibaba 组件之⼀,负责服务注册与 发现。

七、nacos简介

Nacos 致⼒于帮助您发现、配置和管理微服务。Nacos 提供了⼀组简单易⽤的特性集,帮助您快 速实现动态服务发现、服务配置、服务元数据及流量管理。 nacos的作⽤就是⼀个注册中⼼,⽤ 来管理注册上来的各个微服务

7.1 nacos实战入门

1 搭建nacos环境

第1步: 安装nacos

下载地址 : https://github.com/alibaba/nacos/releases

下载 zip 格式的安装包,然后进⾏解压缩操作

第2步: 启动nacos

切换⽬录 cd nacos/bin

命令启动 startup.cmd -m standalone

或者直接双击 startup.cmd 运⾏

第3步: 访问nacos Plain Text

打开浏览器输⼊http://localhost:8848/nacos,即可访问服务, 默认密码是nacos/nacos

7.2 将商品微服务注册到nacos

1 在pom.xml中添加nacos的依赖

复制代码
<!--nacos客户端-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

2 在主类上添加@EnableDiscoveryClient注解

3 在application.yml中添加nacos服务的地址

复制代码
server:
  port: 8091
spring:
  application:
    name: service-orders
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/newshop?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
    username: root
    password: password
  servlet:
    multipart:
      max-request-size: 10MB
      max-file-size: 50MB
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

4 修改OrderController, 借助DiscoveryClient实现微服务调⽤

5 启动服务, 观察nacos的控制⾯板中是否有注册上来的商品微服务

八、服务调⽤Ribbon⼊⻔

经过以上的学习,已经实现了服务的注册和服务发现。当启动某个服务的时候,可以通过HTTP的形式将信息注册到注册中⼼,并且可以通过SpringCloud提供的⼯具获取注册中⼼的服务列表。但是服务之间的调⽤还存在很多的问题,如何更加⽅便的调⽤微服务,多个微服务的提供者如何选择,如何负载均衡等。

8.1 Ribbon概述

Ribbon 是 Netflixfa 发布的⼀个负载均衡器,有助于控制 HTTP 和 TCP客户端⾏为。在 SpringCloud 中, Nacos⼀般配合Ribbon进⾏使⽤,Ribbon提供了客户端负载均衡的功能,Ribbon利⽤从Nacos中读取到的服务信息,在调⽤服务节点提供的服务时,会合理的进⾏负载。 在SpringCloud中可以将注册中⼼和Ribbon配合使⽤,Ribbon⾃动的从注册中⼼中获取服务提供者的列表信息,并基于内置的负载均衡算法,请求服务.

8.2 Ribbon的主要作⽤

( 1)服务调⽤ 基于Ribbon实现服务调⽤, 是通过拉取到的所有服务列表组成(服务名-请求路径的)映射关系。借助 RestTemplate 最终进⾏调⽤

( 2)负载均衡 当有多个服务提供者时,Ribbon可以根据负载均衡的算法⾃动的选择需要调⽤的服务地址

8.3 基于Ribbon实现调⽤服务

1坐标依赖

在springcloud提供的服务发现的jar中以及包含了Ribbon的依赖。所以这⾥不需要导⼊任何额外的坐标

2在创建RestTemplate⽅法上添加 @LoadBalanced 注解

通过服务名称消费使⽤ restTemplate .getForObject("http://商品服务名称/product/1" , Product.class);

九、服务调⽤Ribbon⾼级

9.1 什么是负载均衡

在搭建⽹站时,如果单节点的 web服务性能和可靠性都⽆法达到要求;或者是在使⽤外⽹服务时,经常 担⼼被⼈攻破,⼀不⼩⼼就会有打开外⽹端⼝的情况,通常这个时候加⼊负载均衡就能有效解决服务问 题。

负载均衡是⼀种基础的⽹络服务,其原理是通过运⾏在前⾯的负载均衡服务,按照指定的负载均衡算 法,将流量分配到后端服务集群上,从⽽为系统提供并⾏扩展的能⼒。

负载均衡的应⽤场景包括流量包、转发规则以及后端服务,由于该服务有内外⽹个例、健康检查等功 能,能够有效提供系统的安全性和可⽤性。

9.2 客户端负载均衡与服务端负载均衡

服务端负载均衡:

先发送请求到负载均衡服务器或者软件,然后通过负载均衡算法,在多个服务器之间选择⼀个进⾏访 问;即在服务器端再进⾏负载均衡算法分配

客户端负载均衡:

客户端会有⼀个服务器地址列表,在发送请求前通过负载均衡算法选择⼀个服务器,然后进⾏访问,这 是客户端负载均衡;即在客户端就进⾏负载均衡算法分配

9.3 基于Ribbon实现负载均衡

通过idea再启动⼀个微服务,设置其端⼝为808x

分别启动两次服务器验证效果,并查看两个控制台发现已轮询的⽅式调⽤了商品服务

9.4 负载均衡策略:

Ribbon内置了多种负载均衡策略,内部负责复杂均衡的顶级接⼝为 com.netflix.loadbalancer.IRule ,实现⽅式如下:

com.netflix.loadbalancer.RoundRobinRule :以轮询的⽅式进⾏负载均衡 com.netflix.loadbalancer.RandomRule :随机策略

com.netflix.loadbalancer.RetryRule :重试策略

com.netflix.loadbalancer.WeightedResponseTimeRule :权重策略。会计算每个服务的权重,越 ⾼的被调⽤的可能性越⼤

com.netflix.loadbalancer.BestAvailableRule :最佳策略。遍历所有的服务实例,过滤掉故障实 例,并返回请求数最⼩的实例返回

com.netflix.loadbalancer.AvailabilityFilteringRule :可⽤过滤策略。过滤掉故障和请求数超过阈值的服务实例,再从剩下的实⼒中轮询调⽤

ZoneAvoidanceRule: 以区域可⽤的服务器为基础进⾏服务器的选择。使⽤Zone对服务器进⾏分类,这个Zone可以理解为⼀个机房、⼀个机架等。⽽后再对Zone内的多个服务做轮询

9.5 ⾃定义负载均衡策略

⽅式1:定义⼀个新的IRule:(全局设置)

@Bean

public IRule randomRule(){

return new RandomRule();

}

⽅式2:在yml配置⽂件中配置:(局部设置)

复制代码
#需要调⽤的微服务名称
service-product:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
相关推荐
抚月code2 分钟前
Java线程池
java
IT枫斗者7 分钟前
集合工具类
java·linux·数据库·windows·算法·microsoft
会敲代码的小张20 分钟前
设计模式-观察者模式
java·开发语言·后端·观察者模式·设计模式·代理模式
Licky1324 分钟前
Centos中dnf和yum区别对比
linux·运维·架构·centos·bash
程序猿!=程序员3 小时前
JAVA学习路线
java
Rivieres4 小时前
算法入门-贪心1
java·算法·leetcode·推荐算法
清风霁玥缘4 小时前
Maven入门学习
java·maven
中式代码美式咖啡5 小时前
记录开发一个英语听力训练网站
java·spring boot·bootstrap·音视频·语音识别
开 端5 小时前
文件批量添加水印和密码合并单元格完整版
java·ide·spring
.生产的驴6 小时前
SpringBoot 消息队列RabbitMQ 消息可靠性 数据持久化 与 LazyQueue
java·spring boot·后端·eclipse·rabbitmq·maven·java-rabbitmq