0
点赞
收藏
分享

微信扫一扫

微服务简介

凌得涂 2022-04-03 阅读 60
微服务

1,微服务

微服务架构风格,就像是把一个单独的应用程序开发为一套小服务,每个小服务运行在自己的进程中,并使用轻量级机制通信,通常是Http API 这些服务围绕业务能力来构建,并通过完全自动化部署机制来独立部署。这些服务使用不同的编程语言书写,以及不同数据存储技术,并保持最低限度的集中式管理

拒绝大型单体应用,基于业务边界进行服务微化拆分,各个服务独立部署运行。

2,集群&分布&节点

集群是个物理形态,分布式是个工作方式

分布式系统是若干独立计算机的概念,这些计算机对于用户来说就像单个相关系统。

分布式系统是建立在网络之上的软件系统

分布式是指将不同的业务分布在不同地方

集群指的是将几台服务器集中在一起,实现同一业务。

例如:京东是一个分布式系统,众多业务运行在不同的机器,所有业务构成一个大型的业务集群。每一个小的业务,比如用户系统,访问压力大的时间一台服务器是不够的。我们就应该将用户系统部署到多个服务器上,也就是每一个业务系统也可以做集群化

分布式中的每一个节点,都可以做集群,而集群并不一定就是分布式。

节点:集群中的一个服务器

3,远程调用

在分布式系统中,各个服务可能处于不同主机,但是服务之间不可避免地需要互相调用,我们称之为远程调用。

SpringCloud使用Http+Json的方式完成远程调用

image-20220323151041254

4,负载均衡

image-20220323151245182

分布式系统中,A服务需要调用B服务,B服务在多台机器中存在,A调用任意一个服务器均可完成功能

为了使每一个服务器不要太忙或者太闲,我们可以负载均衡的调用每一个服务器,提升网站的健壮性。

常用的负载均衡算法:

轮询:为第一个请求选择健康池中的第一个后端服务器,然后按顺序往后依次选择,知道最后一个,然后循环。

最小连接:优先选择连接数最少,也就是压力最小的后端服务器,在会话较长的情况下可以考虑采取这种方式。

散列:根据请求源的IP的散列(hash)来选择要转发的服务器。这种方式可以一定程度上保证特定用户能连接到相同的服务器。如果你的应用需要处理状态而要求用户连接到和之前相同的服务器,可以考虑采取这种方式。

5,服务注册/发现&注册中心

A服务调用B服务,A服务并不知道B服务当前在哪几台服务器有,那些正常,那些服务已经下线。解决这个问题可以引入注册中心;

image-20220323152450412

如果某些服务下线,我们其他人可以实时的感知到其他服务的状态,从而避免调用不可用的服务

6,服务熔断&服务降级

在微服务架构中,微服务之间通过网络进行通信,存在相互依赖,当其中一个服务不可用时,有可能造成雪崩效应,要防止这样的情况,必须要有容错的机制来保护服务。

image-20220323155201449

1.1服务熔断

a.设置服务的超时,当被调用的服务经常失败达到某一个阈值,我们可以开启断路保护机制,后来的请求不再去调用这个服务.本地直接返回默认的数据

1.2服务降级

a.在运维期间,当系统处于高峰期,系统资源紧张,我们可以让非核心业务降级运行。降级:某些服务不处理,或者简单处理【抛异常、返回NULL、调用Mock数据、调用Fallback处理逻辑】

8 API网关

在微服务架构中,API Gateway 作为整体架构的重要组件,它抽象了微服务中都需要的公共功能,同时提供了客户端负载均衡,服务自动熔断,灰度发布,统一认证,限流流控,日志统计等丰富的功能,帮助我们解决很多API管理难题。

image-20220323175504547

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,即分布式事务解决方案

image-20220330134253237

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 EnvironmentPropertySources 中。这里我们使用 @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

image-20220330221900255

总结:当请求到达网关,网关先利用断言来判定此次请求是否符合某个路由规则,如果符合就按照路由规则路由到指定地方,要去这些指定地方就要经过一系列的Filter

举报

相关推荐

0 条评论