谷粒商城--注册中心配置中心及网关--笔记二

谷粒商城–注册中心配置中心及网关–笔记二

nacos最新稳定版2.0.3下载地址:

1.nacos注意

nacos启动报org.springframework.context.ApplicationContextException: Unable to start web server

因为nacos是默认的集群模式所以我们在startup.cmd里面第28行改成单机模式就好了

image-20210928171338215

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

3.版本选择

由于 Spring Boot 1 和 Spring Boot 2 在 Actuator 模块的接口和注解有很大的变更, 且
spring-cloud-commons 从 1.x.x 版本升级到 2.0.0 版本也有较大的变更, 因此我们采取跟
SpringBoot 版本号一致的版本:

  • 1.5.x 版本适用于 Spring Boot 1.5.x
  • 2.0.x 版本适用于 Spring Boot 2.0.x
  • 2.1.x 版本适用于 Spring Boot 2.1.x

4.项目中使用(服务注册中心)

1.项目中的依赖

<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>

2.将微服务注册到 nacos 中

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

3.在应用的 /src/main/resources/application.yml配置文件中配置 Nacos Server 地址

spring:
  datasource:
    username: root
    password: root
    url: jdbc:mysql://192.168.157.129:3306/gulimall_sms
    driver-class-name: com.mysql.jdbc.Driver
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
  application:
    name: gulimall-coupon


mybatis-plus:
  mapper-locations: classpath:/mapper/**/*.xml
  global-config:
    db-config:
      id-type: auto
server:
  port: 7000

4.使用@EnableDiscoveryClient 开启服务注册发现功能

@SpringBootApplication
@EnableDiscoveryClient
public class GulimallCouponApplication {
    
    

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

}

5.启动应用, 观察 nacos 服务列表是否已经注册上服务

image-20210928174725506

6.注册更多的服务上去, 测试使用 feign 远程调用

  • Nacos 使用三步

    1、 导包 nacos-discovery

    2、 写配置, 指定 nacos 地址, 指定应用的名字

    3、 开启服务注册发现功能@EnableDiscoveryClient

  • Feign 使用三步

    1、 导包 openfeign

    2、 开启@EnableFeignClients 功能

    3、 编写接口, 进行远程调用

5.open-feign使用

1.导包 openfeign

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

2.在被调用的模块编写接口

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

3.在需要调用的模块开启@EnableFeignClients 功能

basePackages:用到远程调用的
@EnableFeignClients(basePackages = "com.atguigu.gulimall.member.feign")
@EnableDiscoveryClient
@SpringBootApplication
public class GulimallMemberApplication {
    
    

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

4.在需要调用的模块调用

  1. 新建一个feign包,里面用来保存远程调用的接口

image-20210929094823767

  1. 远程调用
/**
 * 这是一个声明式的远程调用
 */
@FeignClient("gulimall-coupon")
public interface CouponFeignService {
    
    

    @RequestMapping("/coupon/coupon/member/list")
    public R membercoupons();

}
  1. 在调用模块controller使用

image-20210929095324018

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

5.调用结果

http://localhost:8000/member/member/coupons

image-20210929101951608

6.nacos作为服务配置中心

1.首先对nacos进行持久化,防止下次启动配置文件消失

  • 进入nacos-server-1.0.1\nacos\conf目录,初始化文件:nacos-mysql.sql
  • Nacos-server其实就是一个Java工程或者说是一个Springboot项目,他的配置文件在nacos-server-1.0.1\nacos\conf目录下,名为 application.properties,在文件底部添加数据源配置:
spring.datasource.platform=mysql

db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/mynacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=root

2.引入依赖

 <!--        配置中心来做配置管理-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

3.为需要统一管理配置的模块创建一个bootstrap.properties

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

4.在配置中心添加配置

  • 需要给配置中心默认添加一个叫 数据集(Data Id)gulimall-member.properties。默认规则,应用名.properties

image-20210929141551638

  • 给 应用名.properties 添加任何配置

5.动态获取配置。

 @RefreshScope:动态获取并刷新配置
 @Value("${配置项的名}"):获取到配置。

注意:如果配置中心和当前应用的配置文件中都配置了相同的项,优先使用配置中心的配置。

@RefreshScope
@RestController
@RequestMapping("member/member")
public class MemberController {
    
    
    @Autowired
    private MemberService memberService;
    @Autowired
    CouponFeignService couponFeignService;
    @Value("${coupon.user.name}")
    private String name;
    @Value("${coupon.user.age}")
    private Integer age;

    @RequestMapping("/test")
    public R test1(){
    
    

        return R.ok().put("name",name).put("age",age);
    }
}

访问测试http://localhost:8000/member/member/test

image-20210929143637225

7.gateway网关

0.常用的断言

image-20210930135724673

名称 描述 使用
After Route Predicate 在xx时间之前 - After=2020-03-08T10:59:34.102+08:00[Asia/Shanghai]
Before Route Predicate 在xx时间之后 - Before=2020-03-08T10:59:34.102+08:00[Asia/Shanghai]
Between Route Predicate 在时间范围之间 - Between=2020-03-08T10:59:34.102+08:00[Asia/Shanghai] , 2020-03-08T10:59:34.102+08:00[Asia/Shanghai]
Cookie Route Predicate Cookie信息在正则表达式范围内 - Cookie=username,zhangshuai #Cookie是username=zhangshuai才能访问
Header Route Predicate Header信息在正则表达式范围内 - Header=X-Request-Id, \d+ #请求头中要有X-Request-Id属性并且值为整数的正则表达式
Host Route Predicate 请求主机地址在配置范围内 - Host=**.baudu.com
Method Route Predicate 请求方法类型 - Method=GET
Path Route Predicate 路径相匹配的进行路由 - Path=/payment/lb/**
Query Route Predicate 查询参数在正则表达式范围内 - Query=username, \d+ #要有参数名称并且是正整数才能路由

1.常用过滤器

详细种类及使用方法:

image-20210930135852047

2.引入gateway依赖

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

3.将网关服务注册到注册中心

application.properties配置

spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.application.name=gulimall-gateway
server.port=88

主启动类配置

@EnableDiscoveryClient
@SpringBootApplication(exclude = {
    
    DataSourceAutoConfiguration.class})
public class GulimallGatewayApplication {
    
    

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

}

网关不需要数据库的情况下,又在common中引入了数据库的依赖加入下面配置

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})

4.application.yml中配置网关规则

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

5.测试

http://localhost:88/?url=baidu

image-20210929160423983

http://localhost:88/?url=qq

image-20210929160519554

Guess you like

Origin blog.csdn.net/qq_31745863/article/details/120550835