谷粒商城-分布式组件(Spring Cloud Alibaba)

微服务-注册中心、配置中心、网关

配置中心:组件的统一配置
网关:前后端映射的预先工作

SpringCloud 的几大痛点

SpringCloud 部分组件停止维护和更新,给开发带来不便;
SpringCloud 部分环境搭建复杂,没有完善的可视化界面,我们需要大量的二次开发和定制
SpringCloud 配置复杂,难以上手,部分配置差别难以区分和合理应用

SpringCloud Alibaba 的优势:

阿里使用过的组件经历了考验,性能强悍,设计合理,现在开源出来大家用
成套的产品搭配完善的可视化界面给开发运维带来极大的便利
搭建简单,学习曲线低
结合 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,即分布式事务解决方案

Nacos注册中心

1.在Spring Cloud项目的pom.xml文件中添加依赖
引入依赖

 <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

2.下载 nacos-server并启动
3.配置 Nacos Server 地址

spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.application.name=guligateway

4.加入注释

@EnableDiscoveryClient
@SpringBootApplication
public class GulicouponApplication {

    public static void main(String[] args) {
        SpringApplication.run(GulicouponApplication.class, args);
    }

}

5.配置服务名称

  application:
    name: gulicoupon

nacos可视化界面-服务管理 可查看具体注册情况
http://127.0.0.1:8848/nacos
谷粒商城-分布式组件(Spring Cloud Alibaba)_第1张图片

测试使用 feign 远程调用

引入依赖

  <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

编写一个接口,告诉Springcloud这个接口需要调用远程服务
在调用方的feign组件中

@FeignClient("gulicoupon")
public interface CouponFeignService {
//被调用的服务的路径以及方法名
    @RequestMapping("/gulicoupon/coupon/member/list")
    public R membercoupons();
}

开启远程调用功能
主函数加入注释

@EnableFeignClients(basePackages ="com.edu.npu.gulimall.gulimember.feign")

测试

    @RequestMapping("/coupons")
    public R test(){
        MemberEntity memberEntity=new MemberEntity();
        memberEntity.setNickname("张三");
        R membercoupons=couponFeignService.membercoupons();
        return R.ok().put("member",memberEntity).put("coupons",membercoupons.get("coupons"));
    }

Nacos配置中心

引入依赖

<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

创建bootstrap.properties 配置文件中配置 Nacos Config 元数据

spring.application.name=nacos-config-example
spring.cloud.nacos.config.server-addr=127.0.0.1:8848

添加配置
在这里插入图片描述
在配置中添加相关配置
谷粒商城-分布式组件(Spring Cloud Alibaba)_第2张图片
添加注释
@RefreshScope
属性值前的@Value

@RefreshScope
@RestController
@RequestMapping("gulicoupon/coupon")
public class CouponController {
    @Autowired
    private CouponService couponService;
    @RequestMapping("/member/list")
    public R membercoupons(){
        CouponEntity couponEntity= new CouponEntity();
        couponEntity.setCouponName("满100减50");
        return R.ok().put("coupons",Arrays.asList(couponEntity));
    }
    @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);
    }
   }

相关概念:
命名空间:
用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。
场景1:Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
需在bootstrap.properties中配置命名空间

spring.cloud.nacos.config.namespace=c0a6e53d-cf87-46a4-a552-10a3ececcf7a

场景2:每一个微服务有自己的命名空间

配置集:一组相关或者不相关的配置项的集合称为配置集
**配置集 ID:**类似于配置文件名。Nacos 中的某个配置集的 ID。配置集 ID 是组织划分配置的维度之一。Data ID 通常用于组织划分系统的配置集。一个系统或者应用可以包含多个配置集,每个配置集都可以被一个有
意义的名称标识。Data ID 通常采用类 Java 包(如 com.taobao.tc.refund.log.level)的命名规则保证全局唯一性。此命名规则非强制。
配置分组:
默认所有的配置集都属于DEFAULT_GROUP
可在bootstrap.properties中配置分组

spring.cloud.nacos.config.group=1111

同时加载多个配置文件

网关-Gateway

为什么使用 API 网关?

API 网关出现的原因是微服务架构的出现,不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题:
客户端会多次请求不同的微服务,增加了客户端的复杂性。
存在跨域请求,在一定场景下处理相对复杂。
认证复杂,每个服务都需要独立认证。
难以重构,随着项目的迭代,可能需要重新划分微服务。例如,可能将多个服务合
并成一个或者将一个服务拆分成多个。如果客户端直接与微服务通信,那么重构将会很难实施。
某些微服务可能使用了防火墙 / 浏览器不友好的协议,直接访问会有一定的困难

核心概念

1.路由。路由是网关最基础的部分,路由信息有一个 ID、一个目的 URL、一组断言和一组Filter 组成。如果断言路由为真,则说明请求的 URL 和配置匹配
2.断言。Java8 中的断言函数。Spring Cloud Gateway 中的断言函数输入类型是 Spring5.0 框架中的 ServerWebExchange。Spring Cloud Gateway 中的断言函数允许开发者去定义匹配来自于 http request 中的任何信息,比如请求头和参数等。
3.过滤器。一个标准的 Spring webFilter。Spring cloud gateway 中的 filter 分为两种类型的Filter,分别是 Gateway Filter 和 Global Filter。过滤器 Filter 将会对请求和响应进行修改处理
注: assert condition,当 condition 为 true,就继续往下运行;当 condition 为 false,就抛出一个错误,程序停止。
工作原理:
谷粒商城-分布式组件(Spring Cloud Alibaba)_第3张图片
客户端发送请求给网关, HandlerMapping 判断是否请求满足某个路由,满足就发给网
关的 WebHandler。这个 WebHandler 将请求交给一个过滤器链,请求到达目标服务之前,会
执行所有过滤器的 pre 方法。请求到达目标服务处理之后再依次执行所有过滤器的 post 方
法。

你可能感兴趣的:(谷粒商城,分布式)