1,微服务
微服务架构风格,就像是把一个单独的应用程序开发为一套小服务,每个小服务运行在自己的进程中,并使用轻量级机制通信,通常是Http API 这些服务围绕业务能力来构建,并通过完全自动化部署机制来独立部署。这些服务使用不同的编程语言书写,以及不同数据存储技术,并保持最低限度的集中式管理
拒绝大型单体应用,基于业务边界进行服务微化拆分,各个服务独立部署运行。
2,集群&分布&节点
集群是个物理形态,分布式是个工作方式
分布式系统是若干独立计算机的概念,这些计算机对于用户来说就像单个相关系统。
分布式系统是建立在网络之上的软件系统
分布式是指将不同的业务分布在不同地方
集群指的是将几台服务器集中在一起,实现同一业务。
例如:京东是一个分布式系统,众多业务运行在不同的机器,所有业务构成一个大型的业务集群。每一个小的业务,比如用户系统,访问压力大的时间一台服务器是不够的。我们就应该将用户系统部署到多个服务器上,也就是每一个业务系统也可以做集群化。
分布式中的每一个节点,都可以做集群,而集群并不一定就是分布式。
节点:集群中的一个服务器
3,远程调用
在分布式系统中,各个服务可能处于不同主机,但是服务之间不可避免地需要互相调用,我们称之为远程调用。
SpringCloud使用Http+Json的方式完成远程调用
4,负载均衡
分布式系统中,A服务需要调用B服务,B服务在多台机器中存在,A调用任意一个服务器均可完成功能
为了使每一个服务器不要太忙或者太闲,我们可以负载均衡的调用每一个服务器,提升网站的健壮性。
常用的负载均衡算法:
轮询:为第一个请求选择健康池中的第一个后端服务器,然后按顺序往后依次选择,知道最后一个,然后循环。
最小连接:优先选择连接数最少,也就是压力最小的后端服务器,在会话较长的情况下可以考虑采取这种方式。
散列:根据请求源的IP的散列(hash)来选择要转发的服务器。这种方式可以一定程度上保证特定用户能连接到相同的服务器。如果你的应用需要处理状态而要求用户连接到和之前相同的服务器,可以考虑采取这种方式。
5,服务注册/发现&注册中心
A服务调用B服务,A服务并不知道B服务当前在哪几台服务器有,那些正常,那些服务已经下线。解决这个问题可以引入注册中心;
如果某些服务下线,我们其他人可以实时的感知到其他服务的状态,从而避免调用不可用的服务
6,服务熔断&服务降级
在微服务架构中,微服务之间通过网络进行通信,存在相互依赖,当其中一个服务不可用时,有可能造成雪崩效应,要防止这样的情况,必须要有容错的机制来保护服务。
1.1服务熔断
a.设置服务的超时,当被调用的服务经常失败达到某一个阈值,我们可以开启断路保护机制,后来的请求不再去调用这个服务.本地直接返回默认的数据
1.2服务降级
a.在运维期间,当系统处于高峰期,系统资源紧张,我们可以让非核心业务降级运行。降级:某些服务不处理,或者简单处理【抛异常、返回NULL、调用Mock数据、调用Fallback处理逻辑】
8 API网关
在微服务架构中,API Gateway 作为整体架构的重要组件,它抽象了微服务中都需要的公共功能,同时提供了客户端负载均衡,服务自动熔断,灰度发布,统一认证,限流流控,日志统计等丰富的功能,帮助我们解决很多API管理难题。
springCloud中
springCloudNetfix有Features:Service Discovery服务注册发现 Eureka注册中心,网关Zuul,断路保护Hystrix
springCloudConfig provides配置中心 帮我们来集中管理配置
SpringCloud Alibaba致力于提供微服务开发的一站式解决方案,此项目包含开发分布式应用微服务的必须组件,方便开发者通过SpringCloud编程模型轻松使用这些组件开发分布式应用服务
依托SpringCloud Alibaba,您只需添加一些注解和少量配置,就可以将SpringCloud应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统
https://githbu.com/alibaba/spring-cloud-alibaba
SpringCloud的几大痛点
SpringCloud部分组件停止维护和更新,给开发带来不便
SpringCloud部分环境搭建复杂,没有完善的可视化界面,我们需要大量的二次开发和定制
SpringCloud配置复杂,难以上手,部分部署差别难以区分和合理应用
SpringCloud Alibaba的优势
阿里使用过的组件经历了考研,性能强悍,设计合理,现在开源出来
成套的产品搭配完善的可视化界面给开发运维带来了极大的遍历
搭建简单,学习曲线低
SpringCloud Alibaba-Nacos:注册中心(服务发现/注册)、
SpringCloud Alibaba-Nacos:配置中心(动态配置管理)
SpringCloud-Ribbon:负载均衡
SpringCloud-Feign:声明式HTTP客服端(调用远程服务)
SpringCloud Alibaba -Sentinel:服务容错(限流、降级、熔断)
SpringCloud-Gateway:API网关(webflux编程模式)
SpringCloud-Sleuth:调用链监控
SpringCloud Alibaba-Seata 原Fescar,即分布式事务解决方案
Fegin是一个声明式的HTTP的客户端,它的目的就是让远程调用更加简单。Fegin提供了HTTP请求模板,通过编写简单的接口和插入注释,就可以定义好HTTP请求的参数、格式、地址等信息。
Fegin整合了Ribbo(负载均衡)和Hystrix(服务熔断),可以让我们不再需要显式地使用这两个组件
SpringCloudFegin在NetflixFegin的基础上扩展了对SpringMvc注释的支持,在其实现下,我们只需创建一个接口并用注解的方式来配置它,即可以完成对服务提供方的接口绑定。简化了SpringCloudRibbon自行封装服务调用客户端的开发量
/**
* 1,想要远程调用别的服务
* 1)引入open-feign
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
在controller中加入
@RequestMapping("/member/list")
public R membercoupons(){
CouponEntity couponEntity = new CouponEntity();
couponEntity.setCouponName("满100减10");
return R.ok().put("coupons",Arrays.asList(couponEntity));
}
* 2)编写一个远程接口,告诉SpringCloud这个接口需要调用远程服务
/**
* 先去mall-coupon的位置,再去调用/coupon/coupon/member/list请求的方法
* 这是一个声明式远程调用
*/
@FeignClient("mall-coupon")
public interface CouponFeginService {
@RequestMapping("/coupon/coupon/member/list")
public R membercoupons();
}
@Autowired
CouponFeginService couponFeginService;
@RequestMapping("/coupons")
public R test(){
//本地调用结果
MemberEntity memberEntity = new MemberEntity();
memberEntity.setNickname("giao");
//使用远程调用方法
R membercoupons = couponFeginService.membercoupons();
return R.ok().put("member",memberEntity).put("coupons",membercoupons.get("coupons"));
}
* 1,声明接口的每一个方法都是调用哪个远程服务的请求
* 3)开启远程调用的功能
* @EnableFeignClients
*/
@EnableFeignClients(basePackages = "com.hhxy.mall.member.fegin")
@EnableDiscoveryClient
@SpringBootApplication
public class MallMemberApplication {
public static void main(String[] args) {
SpringApplication.run(MallMemberApplication.class,args);
}
}
导入pom文件
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
在应用的 /src/main/resources/bootstrap.properties 配置文件中配置 Nacos Config 元数据
spring.application.name=nacos-config-example
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
application.properties中
coupon.user.name=giao
coupon.user.age=18
在控制层中输入
完成上述两步后,应用会从 Nacos Config 中获取相应的配置,并添加在 Spring Environment 的 PropertySources 中。这里我们使用 @Value 注解来将对应的配置注入到 SampleController 的 userName 和 age 字段,并添加 @RefreshScope 打开动态刷新功能
@Value("${coupon.user.name}")
private String name;
@Value("${coupon.user.age}")
private Integer age;
@RequestMapping("/test")
public R test(){
return R.ok().put("name",name).put("age",age);
}
@RefreshScope可以刷新配置
/**
* 1,如何使用Nacos作为配置中心统一管理配置
*
*1)引入依赖,
* <dependency>
* <groupId>com.alibaba.cloud</groupId>
* <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
* </dependency>
*2)创建一个bootstrap.properties
* spring.application.name=mall-coupon
* spring.cloud.nacos.config.server-addr=127.0.0.1.8848
*3)给配置中心默认添加一个叫数据集(Date id)mall-coupon.properties规则,应用名.properties
*4)给应用名.properties添加任何配置
*5)动态获取配置
* @RefreshScope:动态获取并刷新配置
* @Value("${配置项的名})
*如果配置中心和当前应用的配置文件中都配置了相同的项,优先使用配置中心的配置
*
*
* 2,细节
* 1)命名空间:配置隔离
* 默认:public(保留空间);默认新增的所有配置都在public空间
* 1,开发,测试,生产:利用命名空间来做环境隔离
* 注意:在bootstrap.properties:配置上。需要使用那个命名空间下的配置
*spring.cloud.nacos.config.namespace=8545fea4-1231-49c6-8fed-7af7b67ac9b6
* 2,每一个微服务之间互相隔离配置,每一个微服务都创建自己的命名空间,只加载自己命名空间下的所有配置
* 2)配置集
* 所有配置的集合就叫配置集
* 3)配置集ID
* 类似文件名
* Data ID 类似文件名
* 4)配置分组
* 默认所有的配置集都属于:DEFAULT_GROUP
* 1111,618.1212
*
* spring.cloud.nacos.config.group=1111分组
*
* 每个微服务创建自己的命名空间,使用配置分组区分环境,dev test prod
*
* 3,加载多个配置集
* 1)微服务任何配置信息,任何配置环境文件都可以放在配置中心中
* 2)只需要在bootstrap.properties说明加载配置中心中哪些配置文件即可
* 3)@Value @ConfigurationProperties....
* 以前SpringBoot任何方法从配置文件中获取值,都能使用
* 配置中心有的优先使用配置中心的
*
*/
Gateway
网关作为流量的入口,常用功能包括路由转发、权限校验、限流控制等。而springcloud getway作为SpringCloud官方推出的第二代网管框架,取代了Zuul网关
网关提供API全托管服务、丰富的API管理功能。辅助企业管理大规模的API,以降低管理成本和安全风险,包括协议适配、协议转发、安全策略、防刷、流量、监控日志等功能
SpringCloud Gateway旨在提供一种简单而有效的方式来对API进行路由,并为他们提供切面,例如:安全性,监控/指标 和弹性等
Route路由 ID URI地址 a collection of predicates断言集合 and a collection of filters过滤器集合
请求发给API网关要不要路由到某一个地方
Predicate Java8 Function Predicate 请求发给网关,网关可能根据请求的三参数 请求头等各种信息的不同来判断你到底要路由到那个服务,我们这个判断就叫做断言
Fitter过滤器 SpringFramework GatewayFilter
总结:当请求到达网关,网关先利用断言来判定此次请求是否符合某个路由规则,如果符合就按照路由规则路由到指定地方,要去这些指定地方就要经过一系列的Filter