一:Nacos配置管理

1.Nacos配置管理——微服务实现配置管理

spring cloud vault 配置 spring cloud management配置_http


spring cloud vault 配置 spring cloud management配置_http_02

spring cloud vault 配置 spring cloud management配置_gateway_03

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

bootstrap.yml文件在application.yml之前被项目读入

spring cloud vault 配置 spring cloud management配置_http_04


同一配置管理

引入Nacos的配置管理客户端依赖:

<!--nacos的配置管理依赖-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

在userservice中的resource目录添加一个bootstrap.yml文件,这个文件是引导文件,优先级高于application.yml:

spring:
  application:
    name: userservice
  profiles:
    active: dev # 环境
  cloud:
    nacos:
      server-addr: localhost:8848 # nacos地址
      discovery:
        cluster-name: SH #集群名称,这里HZ代指杭州
      config:
        file-extension: yaml # 文件后缀名

在user-service中将pattern.dateformat这个属性注入到UserController中做测试

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

     @Value("${pattern.dateformat}")
     private String dateformat;
 @GetMapping("now")
    public String now(){
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat, Locale.CHINA));
    }
    }
}

spring cloud vault 配置 spring cloud management配置_spring_05

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

spring cloud vault 配置 spring cloud management配置_spring cloud_06


spring cloud vault 配置 spring cloud management配置_配置管理_07


spring cloud vault 配置 spring cloud management配置_配置管理_08

4.Nacos配置管理——多环境配置共享

spring cloud vault 配置 spring cloud management配置_gateway_09


spring cloud vault 配置 spring cloud management配置_http_10


spring cloud vault 配置 spring cloud management配置_配置管理_11

spring cloud vault 配置 spring cloud management配置_gateway_12


spring cloud vault 配置 spring cloud management配置_spring_13

5.Nacos配置管理——nacos集群搭建

链接:https://pan.baidu.com/s/1vokjKM49nJUrbzUT3MZGRA?pwd=ch93

提取码:ch93

spring cloud vault 配置 spring cloud management配置_gateway_14

二:http客户端Feign

1.Feign-基于Feign得远程调用

RestTemplate方式调用存在问题

String url = "http://userservice/user/" + order.getUserId();User user = restTemplate.getForObject(url, User.class);

spring cloud vault 配置 spring cloud management配置_配置管理_15


Feign的介绍

Feign是一个声明式的http客户端,官方地址:https://github.com/OpenFeign/feign

其作用就是帮助我们优雅的实现http请求的发送,解决上面提到的问题。

spring cloud vault 配置 spring cloud management配置_gateway_16


使用Feign的步骤:

引入依赖:

<!--feign客户端依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

在order-service的启动类添加注解开启Feign的功能:

@EnableFeignClients()

编写Feign客户端:
在clients包下面新建一个UserClients接口

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

spring cloud vault 配置 spring cloud management配置_http_17


用Feign客户端代替RestTemplate

spring cloud vault 配置 spring cloud management配置_配置管理_18


spring cloud vault 配置 spring cloud management配置_配置管理_19

2.Feign-自定义配置

spring cloud vault 配置 spring cloud management配置_spring cloud_20

配置日志的级别

  1. 方式一:配置文件方式

全局生效

feign:
  client:
    config: 
      default: #这里使用default就是全局配置,如果改成服务名称,则是针对某个服务
        loggerLevel: FULL #日志级别

局部生效,将default改成服务名称,例如userservice

  1. 方式二:java代码方式,需要先声明一个Bean:
public class DefaultFeignConfiguration {
    @Bean
    public Logger.Level logLevel(){
        return Logger.Level.BASIC;
    }
}

全局配置:

@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration.class)

局部配置:

@EnableFeignClients(value="userservice",defaultConfiguration = DefaultFeignConfiguration.class)

spring cloud vault 配置 spring cloud management配置_http_21

3.Feign-性能优化

Feign底层的客户端实现:

  • URLConnection:默认实现,不支持连接池
  • Apache HttpClient:支持连接池
  • OKHttp:支持连接池

因此优化Feign的性能主要包括:

  • 使用连接池代替默认的URLConnection
  • 日志级别,最好用basic或none

Feign添加HttpClient的支持
引入依赖:

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

配置连接池:

feign:
  httpclient:
    enabled: true # 支持HttpClient的开关
    max-connections: 200 # 最大连接数
    max-connections-per-route: 50 # 单个路径的最大连接数
  client:
    config:
      default: # default全局的配置
        loggerLevel: BASIC # 日志级别,BASIC就是基本的请求和响应信息

spring cloud vault 配置 spring cloud management配置_spring_22

4.Feign-最佳实践

spring cloud vault 配置 spring cloud management配置_配置管理_23


spring cloud vault 配置 spring cloud management配置_spring_24


spring cloud vault 配置 spring cloud management配置_gateway_25


当定义的FeignClient不在SpringBootApplication的扫描包范围时,这些FeignClient无法使用。有两种方式解决:

spring cloud vault 配置 spring cloud management配置_配置管理_26

  • 方式一:指定FeignClient所在包
@EnableFeignClients(basePackages = "cn.itcast.feign.clients")
  • 方式二:指定FeignClient字节码
@EnableFeignClients(clients = UserClient.class)

spring cloud vault 配置 spring cloud management配置_spring cloud_27

三:统一网关Gateway

1.GateWay网关作用和入门

网关功能:

  • 身份认证和权限校验
  • 身份路由、负载均衡
  • 请求限流


    搭建网关服务:
    1.创建新的module,引入SpringcloudGateWay的依赖和nacos的服务发现依赖:
<!--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>

2.编写路由配置及nacos地址

server:
  port: 10010 # 网关端口
spring:
  application:
    name: gateway #服务名称
  cloud:
    nacos:
      server-addr: localhost:8848 #nacos地址
    gateway:
      routes: #网关路由配置
        - id: user-service  #路由id ,自定义,只要唯一即可
          uri: lb://userservice # uri:http://127.0.0.1:8083 路由的目标地址 https就是固定地址
          predicates: #路由断言 。也是判断请求是否符合路由古i则的条件
            - Path=/user/** #这个是按照路径匹配,只要是以/user/开头就符合条件 
        - id: order-service
          uri: lb://orderservice
          predicates:
            - Path=/order/**

spring cloud vault 配置 spring cloud management配置_spring_28


网关搭建步骤:

  1. 创建项目,引入nacos服务发现和gateway依赖
  2. 配置applaction.yml,包括服务基本信息,nacos地址、路由

路由配置包括:

  1. 路由id:路由的唯一标识
  2. 路由目标(uri):路由的目标地址,http代表固定地址。lb代表根据服务名称负载均衡
  3. 路由断言(predicates):判断路由的会泽
  4. 路由过滤器(filters):对请求或相应做处理

2.GateWay——路由断言工厂和路由过滤器

路由断言工厂Route Predicate Factory

spring cloud vault 配置 spring cloud management配置_gateway_29


Gateway断言工厂官网讲述地址:详细

spring cloud vault 配置 spring cloud management配置_spring_30


spring cloud vault 配置 spring cloud management配置_http_31


路由过滤器 GatewayFilter

spring cloud vault 配置 spring cloud management配置_gateway_32


spring cloud vault 配置 spring cloud management配置_spring cloud_33


给所有进入userservice的请求添加一个请求头:Truth=itcast is freaking awesome!

实现方式:在gateway中修改application.yml文件,给userservice的路由添加过滤器

spring:
  application:
    name: gateway #服务名称
  cloud:
    nacos:
      server-addr: localhost:8848 #nacos地址
    gateway:
      routes: #网关路由配置
        - id: user-service  #路由id ,自定义,只要唯一即可
          uri: lb://userservice # uri:http://127.0.0.1:8083 路由的目标地址 https就是固定地址
          predicates: #路由断言 。也是判断请求是否符合路由古i则的条件
            - Path=/user/** #这个是按照路径匹配,只要是以/user/开头就符合条件
          filters: # 过滤器
            - AddRequestHeader=Truth, Itcast is freaking awesome! # 添加请求头

测试:

spring cloud vault 配置 spring cloud management配置_http_34

spring:
  application:
    name: gateway #服务名称
  cloud:
    nacos:
      server-addr: localhost:8848 #nacos地址
    gateway:
      routes: #网关路由配置
        - id: user-service  #路由id ,自定义,只要唯一即可
          uri: lb://userservice # uri:http://127.0.0.1:8083 路由的目标地址 https就是固定地址
          predicates: #路由断言 。也是判断请求是否符合路由古i则的条件
            - Path=/user/** #这个是按照路径匹配,只要是以/user/开头就符合条件
        - id: order-service
          uri: lb://orderservice
          predicates:
            - Path=/order/**
      default-filters: # 默认过滤器,会对所有的路由请求都生效
        - AddRequestHeader=Truth, Itcast is freaking awesome! # 添加请求头

spring cloud vault 配置 spring cloud management配置_gateway_35

3.GateWay——全局过滤器以及过滤器链执行顺序

spring cloud vault 配置 spring cloud management配置_http_36

spring cloud vault 配置 spring cloud management配置_http_37


自定义类,实现GlobalFilter接口,添加@Order注解:

@Order注解和Ordered接口的作用是解决过滤器执行顺序问题

import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.util.MultiValueMap;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

//@Order(-1)
@Component
public class AuthorizeFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 1.获取请求参数
        MultiValueMap<String, String> params = exchange.getRequest().getQueryParams();
        // 2.获取authorization参数
        String auth = params.getFirst("authorization");
        // 3.校验
        if("admin".equals(auth)){
            // 放行
            return chain.filter(exchange);
        }
        //4:拦截
         // 4.1 禁止访问
        exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN);
         // 4.2结束处理
        return exchange.getResponse().setComplete();

        
    }

    @Override
    public int getOrder() {
        return 0;
    }
}

spring cloud vault 配置 spring cloud management配置_http_38


spring cloud vault 配置 spring cloud management配置_gateway_39


spring cloud vault 配置 spring cloud management配置_配置管理_40

4.GateWay网关——网关的跨域请求

spring cloud vault 配置 spring cloud management配置_spring_41


网关处理跨域采用的同样是CORS方案,并且只需要简单配置即可实现:

spring:
  cloud:
    gateway:
      globalcors: # 全局的跨域处理
        add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题
        corsConfigurations:
          '[/**]':
            allowedOrigins: # 允许哪些网站的跨域请求
              - "http://localhost:8090"
              - "http://www.leyou.com"
            allowedMethods: # 允许的跨域ajax的请求方式
              - "GET"
              - "POST"
              - "DELETE"
              - "PUT"
              - "OPTIONS"
            allowedHeaders: "*" # 允许在请求中携带的头信息
            allowCredentials: true # 是否允许携带cookie
            maxAge: 360000 # 这次跨域检测的有效期

spring cloud vault 配置 spring cloud management配置_gateway_42