一 怎么理解微服务以及Spring Cloud?
简而言之,微服务架构风格[1]这种开发方法,是以开发一组小型服务的方式来开发一个独立的应用系统的。其中每个小型服务都运行在自己的进程中,并经常采用HTTP资源API这样轻量的机制来相互通信。这些服务围绕业务功能进行构建,并能通过全自动的部署机制来进行独立部署。这些微服务可以使用不同的语言来编写,并且可以使用不同的数据存储技术。对这些微服务我们仅做最低限度的集中管理。
解读微服务特点:
1:微服务是一种项目架构思想(风格)
2:微服务架构是一系列小服务的组合(组件化与多服务)
3:任何一个微服务,都是一个独立的进程(独立开发、独立维护、独立部署)
4:轻量级通信http协议(跨语言,跨平台)
5:服务粒度(围绕业务模块拆分)
6:去中心化管理(去中心化”地治理技术、去中心化地管理数据)
理解一:
springcloud提供了微服务治理的能力(服务注册与发现、服务降级、限流、熔断、网关、负载均衡、配置中心...),为微服务开发提供了全家桶服务
理解二:
Spring Cloud为开发人员提供了工具,以快速构建分布式系统中的一-些常见模式(例如,配置管理,服务发现,断路器,智能路由,微代理,控制总线,一-次性令牌,全局锁,领导选举,分布式会话,群集 状态)。它们可以在任何分布式环境中正常工作,包括开发人员自己的笔记本电脑,裸机数据中心以及Cloud Foundry等托管平台。
二 怎么区分Spring,Spring MVC,Spring boot ,Spring Cloud
- Spring是核心,提供了基础功能;
- Spring MVC 是基于Spring的一个 MVC 框架 ;
- Spring Boot 是为简化Spring配置的快速开发整合包;
- Spring Cloud是构建在Spring Boot之上的服务治理框架。
三 组件介绍
服务注册与发现
服务注册,就是将提供某个服务的模块信息(通常是这个服务的ip和端口)注册到1个公共的组件上去(比如: zookeeper\consul\eureka\nacos)。
服务发现,就是新注册的这个服务模块能够及时的被其他调用者发现。不管是服务新增和服务删减都能实现自动发现。
注册中心对比
nacos:是阿里开源的,经过了阿里实践的
eureka:netflix公司的,现在不维护了,不开源了
Consul : HashiCorp 公司推出的开源产品,用于实现分布式系统的服务发现、服务隔离、服务配置
Zookeeper: Appache dubbo分布式框架的注册中心使用的是zookeeper
nacos安装:
解压安装包->进入nacos中的conf目录,修改配置文件application.conf--
创建数据库->配置启动方式为单机启动
在nacos下的bin目录,修改starup.cmd文件,set MODE="standalone"
父工程导入依赖
<!-- 父工程的职责:锁定版本 springboot、springcloud、springcloud-alibaba-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.6.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR9</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
解释上面选择版本问题
SpringCloud Alibaba是SpringCloud的子项目,是阿里巴巴结合自身微服务实践,
◆ SpringCloud Alibaba符合SpringCloud标准,依赖于springcloud
服务注册者导入依赖
<!-- web场景依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 端点监控的场景依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- 服务注册与发现的场景依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
配置yml
server:
port: 9001
spring:
application:
name: cloud-goods #指定servicename
cloud:
nacos:
discovery:
server-addr: localhost:8848 #指定注册中心的地址
username: nacos
password: nacos
ip: 192.168.54.21 #指定服务的监听ip地址
在启动类上加注解
启动nacos,访问网址,即可在nacos上注册
负载均衡器Ribbon
是一个"客户端"负载均衡器,运行在客户端上
工作流程:
1 拦截所有远程调用
2 获取请求url,从url解析出servicename
3 根据servicename获取实例列表
先在本地缓存中获取实例列表,如果本地缓存中没有,会向nacos注册中心请求获取实例列表
缓存一份到本地缓存中,如果本地缓存中有,直接返回实例列表
4 从实例列表中通过相应负载均衡算法,选取一个实例
Ribbon核心组件IRule:根据特定算法从服务列表中选取一个需要访问的服务;
其中IRule是一个接口,有七个自带的落地实现类,可以实现不同的负载均衡算法规则:
切换Ribbon负载均衡策略
OpenFeign
作为Spring Cloud的子项目之一,Spring Cloud OpenFeign 是一种声明式、模板化的 HTTP 客户端,在 Spring Cloud 中使用 OpenFeign,可以做到使用 HTTP请求远程服务时能与调用本地方法一样的编码体验,开发者完全感知不到这是远程方法,更感知不到这是个 HTTP 请求。同时OpenFeign通过集成Ribbon实现客户端的负载均衡
使用OpenFeign取代Resttemplate
使用步骤
1 场景依赖
<!--在服务消费方依赖Openfeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2 开启openfeign扫描
3 接口声明
4 接口调用
package com.qf.controller;
/**
* @author: 玉米
* @description
* @date: 2022/3/30 16:08
*/
import com.qf.api.JIfenApi;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
@RestController
@RequestMapping("order")
@RefreshScope
public class OrderController {
@Autowired
//private RestTemplate restTemplate;
private JIfenApi jIfenApi;
@Value("${info.name}")
private String Name;
@RequestMapping("info")
public String info(){
return Name;
}
/* @RequestMapping("save")
public Map save(){
//1:查询商品信息
//goodService.findByID()本地调用
//java发送http请求(appache httpclient ===spring封装==》 RestTempalte)
String url = "http://cloud-goods/goods/findById/1";
Map res = restTemplate.getForObject(url, Map.class);
//2:保存订单信息
System.out.println("order save success");
return res;
}*/
@RequestMapping("testjifen")
public Map testjifen(){
return jIfenApi.DeleteById(1);
}
}
之前是上面灰色那段调用,现在是接口调用,同时将接口声明都放在一个工程里更方便维护
配置中心
传统配置文件管理存在弊端
1 配置文件太分散,不能集中管理
2 大量冗余配置,通用配置信息不能共享
3 不支持配置信息的动态刷新
主流配置中心对比
从配置中心角度来看,性能方面Nacos的读写性能最高,Apollo次之,Spring Cloud Config依赖Git场景不适合开放的大规模自动化运维API。
功能方面Apollo最为完善,nacos具有Apollo大部分配置管理功能,而Spring CloudConfig不带运维管理界面,需要自行开发。
Nacos的一大优势是整合了注册中心、配置中心功能,部署和操作相比Apollo都要直观简单,因此它简化了架构复杂度,并减轻运维及部署工作。
服务加载配置文件
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
总结
1:注册中心(nacos),实现服务的注册与发现
2:Ribbon,客户端的负载均衡器,解决服务集群的负载均衡
3:Openfeign,声明式的http客户端,服务间远程调用,并通过ribbon实现负载均衡
4:配置中心(nacos),配置信息中心化管理,共享配置,支持动态刷新