SpringCloud入门详细教程二(Nacos配置管理,http客户端Feign,统一网关Gateway)

一:Nacos配置管理

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

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

在这里插入图片描述

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

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

在这里插入图片描述
同一配置管理
引入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));
    }
    }
}

在这里插入图片描述

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

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

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

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

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

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

链接:https://pan.baidu.com/s/1vokjKM49nJUrbzUT3MZGRA?pwd=ch93
提取码:ch93
在这里插入图片描述

二:http客户端Feign

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

RestTemplate方式调用存在问题

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

在这里插入图片描述
Feign的介绍
Feign是一个声明式的http客户端,官方地址:https://github.com/OpenFeign/feign
其作用就是帮助我们优雅的实现http请求的发送,解决上面提到的问题。
在这里插入图片描述
使用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);
}

在这里插入图片描述
用Feign客户端代替RestTemplate
在这里插入图片描述
在这里插入图片描述

2.Feign-自定义配置

在这里插入图片描述

配置日志的级别

  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)

在这里插入图片描述

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就是基本的请求和响应信息 

在这里插入图片描述

4.Feign-最佳实践

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

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

在这里插入图片描述

三:统一网关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/**

            

在这里插入图片描述
网关搭建步骤:

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

路由配置包括:

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

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

路由断言工厂Route Predicate Factory
在这里插入图片描述
Gateway断言工厂官网讲述地址:详细
在这里插入图片描述
在这里插入图片描述
路由过滤器 GatewayFilter
在这里插入图片描述
在这里插入图片描述
给所有进入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:
  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! # 添加请求头

在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述
自定义类,实现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;
    }
}

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

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

在这里插入图片描述
网关处理跨域采用的同样是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 # 这次跨域检测的有效期

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

@黑夜中的一盏明灯

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

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

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

打赏作者

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

抵扣说明:

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

余额充值