SpringCloud笔记 - Day2 Nacos & Feign & Gateway

1. Nacos配置管理

配置的热更新
在这里插入图片描述

DataID 命名格式: 实例名-环境名.后缀名(yaml)
尽量用 yaml,不用 yml

在这里插入图片描述
在这里插入图片描述

2. Nacos配置管理 - 微服务配置拉取

在这里插入图片描述
把所有nacos地址和配置信息都放在 bootstrap.yml

  1. 引入 Nacos配置管理依赖
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
  1. 新建 bootstrap.yml (bootstrap.yml为引导文件,它的优先级比application.yml要高)
spring:
  application:
    name: user-service
  profiles:
    active: dev
  cloud:
    nacos:
      config:
        file-extension: yaml # 配置文件后缀
        namespace: c3b1bbc3-0ebd-4298-92c2-1e54858acf02 # 命名空间
        group: DEFAULT_GROUP # 配置组
        prefix: user-service # 配置文件前缀

      server-addr: localhost:8848 # nacos地址
      discovery:
        namespace: c3b1bbc3-0ebd-4298-92c2-1e54858acf02 # 命名空间
        group: DEFAULT_GROUP # 配置组
  1. 读取配置

在Nacos的配置为:
pattern-dateformat=yyyy-MM-dd HH:mm:ss

在usercontroller.java里:

@NacosValue("${pattern.dateformat}")
private String dateformat;

@GetMapping("now")
public String now() {
    return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat));
}

此处遇到坑:

  1. 要使用@NacosValue注解
  2. 要确保namespace一致
  3. boot, cloud, alibaba版本匹配
  4. 有时候需要重启一下nacos

在这里插入图片描述

3. Nacos配置管理 - 配置热更新

配置自动刷新

方式一:在@Value注入的变量所在类上面添加注解 @RefreshScope

@Slf4j
@RestController
@RequestMapping("/user")
@RefreshScope
public class UserController {

方法二:使用@ConfigurationProperties注解

package cn.itcast.user.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Data
@Component
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
    private String dateformat;
}

然后直接访问 PatternProperties的bean的dateformat就行。

在这里插入图片描述

4. Nacos配置管理 - 微服务配置共享

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

5. Nacos配置环境 - Nacos集群管理

在这里插入图片描述
在这里插入图片描述

6. 基于Feign的远程调用

在这里插入图片描述

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

在启动类上加注解@EnableFeignClients

@EnableFeignClients
@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
public class OrderApplication {

编写 Feign 客户端

@FeignClient(value = "userservice")
public interface UserClient { 
    @GetMapping("/user/{id}")
    User findById(@PathVariable("id") Long id);
}

调用:

    public Order queryOrderById(Long orderId) {
        // 1.查询订单
        Order order = orderMapper.findById(orderId);
        // 2.用Feign远程调用
        User user = userClient.findById(order.getUserId());
        // 3.封装user到Order
        order.setUser(user);
        // 4.返回
        return order;
    }

在这里插入图片描述

7. Feign - 自定义配置

在这里插入图片描述
覆盖配置方式:

配置文件:

全局:

feign:
	client:
		config:
			default:
				loggerLevel: FULL


局部:

feign:
	client:
		config:
			userservice:
				loggerLevel: FULL


java代码形式:

// FeignClientConfiguration.java
public class DefaultFeignConfiguration {
    @Bean
    public Logger.Level logLevel(){
        return Logger.Level.BASIC;
    }
}

全局:

@EnableFeignClients(defaultConfiguration = FeignClientConfiguration.class)

局部

@FeignClient(value = "userservice", configuration = FeignClientConfiguration.class)

在这里插入图片描述

8. Feign - 性能优化

在这里插入图片描述

  1. 引入 HttpClient依赖
<dependency>
    <!-- httpClient -->
    <groupId>io.github.openfeign</groupId>
    <artifactId>fegin-httpclient</artifactId>
</dependency>

配置连接池:

feign:
	client:
		config:
			default:
				loggerLevel: BASIC
	httpclient:
		enabled: true # 开启feign对HttpClient的支持
		max-connections: 200 #最大连接数
		max-connections-per-route: 50 #每个路径的最大连接数

在这里插入图片描述

9. Feign - 最佳实践

方式一(继承):给消费者的FeignClient和提供者controller定义统一的父接口作为标准。

在这里插入图片描述
方式二(抽取):将FeignClient抽取为独立模块,并且把接口有关的pojo,默认的Feign配置都放到这个模块中,提供给所有消费者使用。

在这里插入图片描述

10. Feign - 实现抽取

  1. 新建module,命名为feign-api,引入 feign的starter依赖。
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
  1. 将所有client、pojo和配置类都放到feign-api里面

  2. 改变import的路径

  3. 重启重试即可。

11. Gateway - 网关介绍

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

12. Gateway - 快速入门

  1. 新建module,命名为 gateway2,引入依赖
<!--nacos服务注册发现依赖-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--网关gateway依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
  1. 创建GatewayApplication,编写路由配置及nacos地址
server:
  port: 10010
logging:
  level:
    cn.itcast: debug
  pattern:
    dateformat: MM-dd HH:mm:ss:SSS
spring:
  application:
    name: gateway
  cloud:
    nacos:
      server-addr: nacos:8848 # nacos地址
    gateway:
      routes:
        - id: user-service # 路由标示,必须唯一
          uri: lb://userservice # 路由的目标地址
          predicates: # 路由断言,判断请求是否符合规则
            - Path=/user/** # 路径断言,判断路径是否是以/user开头,如果是则符合
        - id: order-service
          uri: lb://orderservice
          predicates:
            - Path=/order/**

在这里插入图片描述

在这里插入图片描述

13. Gateway - 路由断言工厂

在这里插入图片描述
!
在这里插入图片描述

14. Gateway - 路由过滤器GatewayFilter

在这里插入图片描述
在这里插入图片描述
全局过滤器:

spring:
  application:
    name: gateway
  cloud:
    nacos:
      server-addr: nacos:8848 # nacos地址
    gateway:
	  ...
      default-filters:
        - AddRequestHeader=Truth,Itcast is freaking awesome!
      ...

在这里插入图片描述

15. Gateway - GlobalFilter

在这里插入图片描述


// @Order(-1)
@Component
public class AuthorizeFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 1.获取请求参数
        ServerHttpRequest request = exchange.getRequest();
        MultiValueMap<String, String> params = request.getQueryParams();
        // 2.获取参数中的 authorization 参数
        String auth = params.getFirst("authorization");
        // 3.判断参数值是否等于 admin
        if ("admin".equals(auth)) {
            // 4.是,放行
            return chain.filter(exchange);
        }
        // 5.否,拦截
        // 5.1.设置状态码
        exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
        // 5.2.拦截请求
        return exchange.getResponse().setComplete();
    }

    @Override
    public int getOrder() {
        return -1;
    }
}

在这里插入图片描述

在这里插入图片描述

16. Gateway - 过滤器链执行顺序

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

17. Gateway - Cors跨域问题处理

在这里插入图片描述

spring:
  application:
    name: gateway
  cloud:
    gateway:
      globalcors:
        add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题
        cors-configurations:
            '[/**]':
                allowedOrigins: #允许哪些网站的跨域请求
                  - 'http://localhost:10000' 
                allowedMethods: #允许跨域请求的方法
                  - 'GET'
                  - 'POST'
                  - 'PUT'
                  - 'DELETE'
                  - 'OPTIONS'
                allowedHeaders: '*' # 允许跨域请求的头
                allowCredentials: true # 是否允许携带cookie
                maxAge: 3600 # 跨域请求的有效时间
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

okfang616

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值