码迷,mamicode.com
首页 > 编程语言 > 详细

谷粒商城(三):SpringCloud Alibaba

时间:2021-03-29 11:56:46      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:优惠券   red   default   resource   路由转发   刷新   创建   over   开启   

搭配方案

  • SpringCloud Alibaba - Nacos:注册中心(服务发现/ 注册)
  • SpringCloud Alibaba - Nacos:配置中心(动态配置管理)
  • SpringCloud - Ribbon:负载均衡
  • SpringCloud - Feign:声明式HTTP客户端(调用远程服务)
  • SpringCloud Alibaba - Sentinel:服务容错(限流、降级、熔断)
  • SpringCloud - Gateway:API网关(webflux编程模式)
  • SpringCloud - Sleuth:调用链监控
  • SpringCloud Alibaba - Seata:分布式事务解决方案

在 common 的 pom.xml 中加入如下配置(依赖管理,相当于以后再 dependencies 里引 spring cloud alibaba 相关的依赖就不用写版本号, 全用 dependencyManagement 进行管理。注意他和普通依赖的区别,他只是备注一下,并没有加入依赖):

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>2.1.0.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

Nacos

一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。Nacos 作为注册中心和配置中心。

下载 Nacos 压缩包并解压,然后点击 bin/startup.cmd 启动 Nacos。

技术图片

  • 在某个项目中的 application.yml 里写入 nacos 地址并且配置服务中心名和当前模块名字。
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
  application:
    name: gulimall-coupon
  • 在 common 添加依赖:
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
  • 使用 @EnableDiscoveryClient 注解开启服务注册与发现功能。
@EnableDiscoveryClient // 将该服务注册到nacos中
@SpringBootApplication
@MapperScan("com.qjy.gulimall.coupon.dao")
public class GulimallCouponApplication {
    public static void main(String[] args) {
        SpringApplication.run(GulimallCouponApplication.class, args);
    }
}

Feign

Feign是一个声明式的 HTTP 客户端,目的就是让远程调用更加简单,给远程服务发的是HTTP请求。

在 CouponController.java 请一个请求给 member 服务远程调用:

@RequestMapping("/member/list")
public R membercoupons(){
    CouponEntity couponEntity = new CouponEntity();
    couponEntity.setCouponName("满100-10");
    return R.ok().put("coupons",Arrays.asList(couponEntity));
}

远程调用步骤:

  • 引入 open-feign 依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
  • 在调用者 member 服务中编写远程调用接口
package com.qjy.gulimall.member.feign;

import com.qjy.common.utils.R;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;

// 告诉spring cloud这个接口是一个远程客户端,要调用coupon服务(nacos中找到)
@FeignClient("gulimall-coupon")
public interface CouponFeignService {
    // 远程服务的url
    // 注意写全优惠券类上还有映射
    //注意我们这个地方不是控制层,所以这个请求映射请求的不是我们服务器上的东西,而是nacos注册中心的
    @RequestMapping("/coupon/coupon/member/list")
    public R membercoupons();
}
  • 开启远程调用功能
@EnableFeignClients(basePackages = "com.qjy.gulimall.member.feign") // 开启远程调用功能
@EnableDiscoveryClient
@SpringBootApplication
@MapperScan("com.qjy.gulimall.member.dao")
public class GulimallMemberApplication {
    public static void main(String[] args) {
        SpringApplication.run(GulimallMemberApplication.class, args);
    }
}
  • 测试远程调用功能
@RestController
@RequestMapping("member/member")
public class MemberController {
    @Autowired
    private MemberService memberService;

    @Autowired
    CouponFeignService couponFeignService;

    @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"));
    }
}

技术图片

错误:No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-loadbalancer?

由于 SpringCloud Feign 在 Hoxton.M2 RELEASED 版本之后不再使用 Ribbon 而是使用 spring-cloud-loadbalancer,所以不引入 spring-cloud-loadbalancer 会报错。因此在 common 服务的 pom 文件中引入相关依赖即可。

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-loadbalancer</artifactId>
    <version>2.2.2.RELEASE</version>
</dependency>

配置管理

可以用 Nacos 作为配置中心。所有配置文件统一管理,这样修改更方便,不需要一个一个服务去修改。

  • 在 common 服务中添加 nacos 配置中心的依赖。
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
  • 在 coupon 服务中创建 /src/main/resources/bootstrap.properties,这个文件是 springboot 规定的,它的优先级高于 application.properties。
# nacos里同名的配置文件
spring.application.name=gulimall-coupon
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
  • 在nacos中配置需要的配置文件

技术图片

  • 测试效果:
@RefreshScope // 动态获取配置并刷新数据(配置修改不需要重启服务)
@RestController
@RequestMapping("coupon/coupon")
public class CouponController {
    @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);
    }
}

在 nacos 中还可以配置:

  • 命名空间:用作配置环境隔离

    • 默认为 public,默认新增的配置都在 public 空间下。
    • 在 bootstrap.properties 里配置选择命名空间
    # 设置命名空间:命名空间ID
    spring.cloud.nacos.config.namespace=27995220-b059-40c2-a861-85626e818164
    
  • 配置集:一组相关或不相关配置项的集合

  • 配置集ID:类似于配置文件名,即 Data ID

  • 配置分组:默认所有的配置集都属于 DEFAULT_GROUP

# 更改配置分组
spring.cloud.nacos.config.group=DEFAULT_GROUP

最终方案:每个微服务创建自己的命名空间,然后使用配置分组区分环境(dev/test/prod)。

加载多配置集:把原来 application.yml 里的内容都分文件抽离出去。

nacos 新版本 data-id 只能是 yaml,否则获取不到配置信息。

spring.cloud.nacos.config.ext-config[0].data-id=datasource.yaml
spring.cloud.nacos.config.ext-config[0].group=dev
spring.cloud.nacos.config.ext-config[0].refresh=true

spring.cloud.nacos.config.ext-config[1].data-id=mybatis.yaml
spring.cloud.nacos.config.ext-config[1].group=dev
spring.cloud.nacos.config.ext-config[1].refresh=true

spring.cloud.nacos.config.ext-config[2].data-id=others.yaml
spring.cloud.nacos.config.ext-config[2].group=dev
spring.cloud.nacos.config.ext-config[2].refresh=true

技术图片

Gateway

网关是请求流量的入口,常用功能包括路由转发,权限校验,限流控制等。springcloud gateway 取代了 zuul 网关。

网关提供 API 全托管服务,丰富的 API 管理功能,辅助企业管理大规模的 API,以降低管理成本和安全风险,包括协议适配、协议转发、安全策略、防刷流量、监控日志等功能。

而 SpringCloud Gateway,意在提供一种简单而有效的方式来对 API 进行路由,并为他们提供切面(安全性、监控/指标和弹性等) 。

三大核心概念:

  • Route:发一个请求给网关,网关要将请求路由到指定的服务。路由有 id,目的地 uri,断言的集合,匹配了断言就能到达指定位置。
  • Predicate(断言):Java里的断言函数,匹配请求里的任何信息,包括请求头等。根据请求头路由哪个服务。
  • Filter:过滤器请求和响应都可以被修改。

客户端发请求给服务端。中间有网关,先交给映射器,如果能处理就交给 handler 处理,然后交给一系列 filer,然后给指定的服务,再返回回来给客户端。

技术图片

创建一个 gulimall-gateway 项目,并添加依赖。在gateway服务中开启注册服务发现@EnableDiscoveryClient,配置 nacos 注册中心地址 applicaion.properties。

<dependency>
    <groupId>com.qjy.gulimall</groupId>
    <artifactId>gulimall-common</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.application.name=gulimall-gateway
server.port=88

bootstrap.properties 填写 nacos 配置中心地址。

spring.application.name=gulimall-gateway
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.namespace=833cadca-05f4-44e0-bcdc-d9561556b35d

在项目里创建 application.yml,配置网关的规则(uri、断言与过滤器)。

spring:
  cloud:
    gateway:
      routes:
        - id: test_route
          uri: https://www.baidu.com
          predicates:
            - Query=url,baidu

        - id: qq_route
          uri: https://www.qq.com
          predicates:
            - Query=url,qq

        - id: product_route
          uri: lb://gulimall-product
          predicates:
            - Path=/api/product/**
          filters:
            - RewritePath=/api/(?<segment>.*),/$\{segment}

        - id: third_party_route
          uri: lb://gulimall-third-party
          predicates:
            - Path=/api/thirdparty/**
          filters:
            - RewritePath=/api/thirdparty/(?<segment>.*),/$\{segment}

        - id: member_route
          uri: lb://gulimall-member
          predicates:
            - Path=/api/member/**
          filters:
            - RewritePath=/api/(?<segment>.*),/$\{segment}

        - id: ware_route
          uri: lb://gulimall-ware
          predicates:
            - Path=/api/ware/**
          filters:
            - RewritePath=/api/(?<segment>.*),/$\{segment}

        - id: admin_route
          uri: lb://renren-fast
          predicates:
            - Path=/api/**
          filters:  # 这段过滤器和验证码有关,api内容缓存了/renren-fast,还得注意/renren-fast也注册到nacos中
            - RewritePath=/api/(?<segment>.*),/renren-fast/$\{segment}

谷粒商城(三):SpringCloud Alibaba

标签:优惠券   red   default   resource   路由转发   刷新   创建   over   开启   

原文地址:https://www.cnblogs.com/fireonfire/p/14584148.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!