JavaWeb_SpringCloud微服务_Day2-Nacos, Feign, GateWay

本文详细介绍了SpringCloud微服务中Nacos的配置管理,包括配置的热更新和多环境配置共享。接着讲解了Feign的快速入门、自定义配置以及性能优化的最佳实践。最后,探讨了GateWay的路由断言工厂、过滤器和全局过滤器的使用,以及如何处理跨域问题。
摘要由CSDN通过智能技术生成

nacos

统一配置管理

  • 依赖
    <!-- nacos配置管理依赖 -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>
    
  • bootstrap.yml
    spring:
        application:
            name: userservice # 服务名称
        profiles:
            active: dev # 开发环境
        cloud:
            nacos:
            server-addr: localhost:8848 # Nacos地址
        #      discovery:
        #        # cluster-name: SH
        #        namespace: 84c5c3c0-8065-468b-8708-5f699f392f67 # 命名空间
            config:
                namespace: 84c5c3c0-8065-468b-8708-5f699f392f67 # 命名空间
                file-extension: yaml # 文件后缀名
    
  • 拉取配置
    @Value("${pattern.dateformat}")
    private String dateformat;
    
    @GetMapping("/now")
    public String now()
    {
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat));
    }
    
  • 总结
    • nacos配置读取在本地配置读取之前, 所以需要引入bootstrap.yml写入nacos配置, bootstrap.yml的优先级很高
    • 服务名称+开发环境+文件后缀名 = 读取文件id

配置热更新

  • 通过@Value注解注入, 结合@RefreshScope来刷新
    @RefreshScope
    public class UserController {
    
        @Value("${pattern.dateformat}")
        private String dateformat;
    }
    
  • 通过@ConfigurationProperties注入, 自动刷新
    @Component
    @ConfigurationProperties(prefix = "pattern")
    public class PatternProperties {
        private String dateformat;
    }
    
  • 注意事项
    • 不是所有的配置都式和放到配置中心, 维护起来比较麻烦
    • 建议将一些关键参数, 需要运行时调整的参数放到nacos配置中心, 一般都是自定义配置

多环境配置共享

微服务会从nacos读取的配置文件

  • [服务名]-[spring.profile.active].yaml, 环境配置
  • [服务名].yaml, 默认配置, 多环境共享

优先级
[服务名]-[环境].yaml > [服务名].yaml > 本地配置

feign

快速入门

  1. 引入依赖
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
    
  2. 启动类添加注解开启Feign
    @EnableFeignClients
    public class OrderApplication {
        public static void main(String[] args) {
            SpringApplication.run(OrderApplication.class, args);
        }
    }
    
  3. 编写Feign客户端
    @FeignClient("userservice")
    public interface UserClient {
        @GetMapping("/user/{id}")
        User findById(@PathVariable Long id);
    }
    
  4. 用Feign客户端代替RestTemplate
    @Autowired
    private UserClient userClient;
    
    public Order queryOrderById(Long orderId) {
        // 1.查询订单
        Order order = orderMapper.findById(orderId);
        // 2. 利用Feign发起http请求, 查询用户
        User user = userClient.findById(order.getUserId());
        // 3 封装user到order
        order.setUser(user);
        // 4.返回
        return order;
    }
    

自定义配置

类型作用说明
feign.Logger.Level修改日志级别包含四种不同的级别:NONE、BASIC、HEADERS、FULL
feign.codec.Decoder响应结果的解析器http远程调用的结果做解析,例如解析json字符串为java对象
feign.codec.Encoder请求参数编码将请求参数编码,便于通过http请求发送
feign.Contract支持的注解格式默认是SpringMVC的注解
feign.Retryer失败重试机制请求失败的重试机制,默认是没有,不过会使用Ribbon的重试
  • 通过配置文件
    feign:
    client:
        config:
        default: # default是全局配置
            loggerLevel: FULL # 日志级别
    #      userservice: # 单个微服务的配置
    #        loggerLevel: FULL # 日志级别 
    
  • 通过代码
// 声明Bean
public class DefaultFeignConfiguration {
    @Bean
    public Logger.Level feignLogLevel()
    {
        return Logger.Level.BASIC;
    }
}

// 在启动类添加注解
// 全局配置
@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration.class)
// 局部配置
@FeignClient(value = "userservice", configuration = DefaultFeignConfiguration.class)

性能优化

Feign底层的客户端实现

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

优化Feign性能主要包括

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

连接池配置

  • 依赖
    <dependency>
        <groupId>io.github.openfeign</groupId>
        <artifactId>feign-httpclient</artifactId>
    </dependency>
    
  • 配置
    feign:
    httpclient:
        enabled: true # 开启feign对HttpClient的支持
        max-connections: 200 # 最大的连接数
        max-connections-per-route: 50 # 每个路径的最大连接数
    

最佳实践

  • 方式一(继承): 给消费者的FeignClient和提供者的controller定义统一的父接口作为标准
    • 服务紧耦合
    • 父接口参数列表中的映射不会被继承
  • 方式二(抽取): 将FeignClient抽取为独立模块, 并且把接口有关的pojo, 默认的feign配置都放到这个模块中, 提供给消费者使用
    1. 首先创建一个module,命名为feign-api,然后引入feign的starter依赖
      <dependencies>
          <dependency>
              <groupId>org.springframework.cloud</groupId>
              <artifactId>spring-cloud-starter-openfeign</artifactId>
          </dependency>
      </dependencies>
      
    2. 将order-service中编UserClient、User、DefaultFeignConfiguration都复制到feign-api项目中
    3. 在order-service中引入feign-api的依赖
      <dependency>
          <groupId>cn.itcast.demo</groupId>
          <artifactId>feign-api</artifactId>
          <version>1.0</version>
      </dependency>
      
    4. 修改order-service中的所有与上述三个组件有关的import部分,改成导入feign-api中的包
    5. 导入FeignClient(启动类)
      // 方式一: 指定FeignClient所在包
      @EnableFeignClients(basePackages = "cn.itcast.feign.clients")
      // 方式二: 指定FeignClient字节码
      @EnableFeignClients(clients = {UserClient.class})
      

GateWay

介绍

网关的作用

  • 对用户请求做身份认证, 权限校验
  • 将用户请求路由到微服务, 并实现负载均衡
  • 对用户请求做限流

SpringCloud中网关的实现

  • GateWay
  • Zuul

注: Zuul是基于Servlet的实现,属于阻塞式编程。而SpringCloudGateway则是基于Spring5中提供的WebFlux,属于响应式编程的实现,具备更好的性能。

快速入门

  1. 创建module, 引入SpringCloudGateWay依赖和nacos服务发现依赖
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    
  2. application.yml
    server:
    port: 10010
    spring:
    application:
        name: gateway
    cloud:
        nacos:
        server-addr: localhost:8848
        gateway:
        routes: # 网关路由配置
            - id: user-service # 路由id, 自定义, 唯一即可
            # uri: http://127.0.0.1:8081 # 固定地址
            uri: lb://userservice # lb就是负载均衡, 后面跟服务名称
            predicates: # 路由断言, 也就是判断请求是否符合路由规则的条件
                - Path=/user/** # 这个是按照路径匹配, 只要以/user/开头就符合要求
            - id: order-service
            uri: lb://orderserver
            predicates:
                - Path=/order/**
    
    

路由断言工厂

Spring提供了11种Predi工厂

名称说明
After是某个时间点后的请求
Before是某个时间点之前的请求
Between是某两个时间点之前的请求
Cookie请求必须包含某些cookie
Header请求必须包含某些header
Host请求必须是访问某个host (域名)
Method请求方式必须是指定方式
Path请求路径必须符合指定规则
Query请求参数必须包含指定参数
RemoteAddr请求者的ip必须是指定范围
Weight权重处理

过滤器

  • 配置
    spring:
        cloud:
            gateway:
                routes: # 网关路由配置
                    filters: # 过滤器
                        - AddRequestHeader=Truth, Itcast is freaking awesome! # 添加请求头
    
  • 代码
    public User queryById(@PathVariable("id") Long id,
                        @RequestHeader(value = "Truth", required = false) String truth) {
        System.out.println("truth: "+truth);
        return userService.queryById(id);
    }
    
  • 对所有路由生效的配置
      spring:
          cloud:
              gateway:
                  default-filters: # 默认过滤器, 会对所有的路由器请求都生效
                    - AddRequestHeader=Truth, Itcast is freaking awesome! # 添加请求头 
    

全局过滤器

@Order(-1)
@Component
public class AuthorizeFilter implements GlobalFilter {
    @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();
    }
}

过滤器执行顺序

  • order值越小, 优先级越高
  • order值一样时, defaultFilter>局部的路由过滤器>全局过滤器

跨域

跨域:域名不一致就是跨域,主要包括

  • 域名不同: www.taobao.com 和 www.taobao.org 和 www.jd.com 和miaosha,jd.com
  • 域名相同,端口不同: localhost:8080和localhost:8081
  • 跨域问题: 浏览器禁止请求的发起者与服务端发生跨域ajax请求,请求被浏览器拦截的问题
  • 解决方案: 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 # 这次跨域检测的有效期

来源

黑马程序员. SpringCloud微服务

### 回答1: javaweb_cloud_elevue_pro微服务框架旗舰版源码是一套针对Java开发的微服务框架,该框架提供了一系列功能和组件,用于帮助开发者更轻松地构建和管理微服务架构。 该框架的源码是指该框架的具体实现代码,通过阅读源码,开发者可以深入了解框架的设计思想和实现细节,有助于更好地理解和使用该框架。 javaweb_cloud_elevue_pro微服务框架旗舰版源码的特点主要包括以下几点: 1. 模块化设计:源码采用模块化设计,将整个框架拆分成多个独立的模块,每个模块负责不同的功能,有利于代码的组织和维护。 2. 弹性扩展:框架采用了微服务架构,可以很方便地进行系统扩展,支持动态添加和移除服务实例,以适应不同的业务需求。 3. 高可用性:框架提供了集群和负载均衡的支持,可以提高系统的可用性和性能。 4. 分布式事务管理:源码包含了分布式事务管理的实现,可以保证系统在多节点环境下的数据一致性。 5. 可靠消息传递:框架提供了消息队列和分布式任务调度的功能,可以确保消息的可靠传递和任务的可靠执行。 6. 监控和管理:框架提供了丰富的监控和管理功能,可以对系统进行实时监控和管理,方便开发者进行故障排查和性能调优。 总之,javaweb_cloud_elevue_pro微服务框架旗舰版源码是一套成熟的微服务框架实现代码,通过研究源码,开发者可以更好地理解和使用该框架,提高开发效率和系统稳定性。 ### 回答2: javaweb_cloud_elevue_pro微服务框架是一款功能强大的微服务开发框架,是javaweb_cloud_elevue_pro产品家族中的旗舰版。 该框架的源码提供了一套完整的微服务解决方案,包含了丰富的功能模块和技术组件,可用于构建高性能、稳定可靠的分布式系统。 源码中包含了一系列核心组件,如服务注册与发现、负载均衡、熔断降级、分布式配置中心等,这些组件可以快速搭建起一个具有高可用性和可伸缩性的微服务架构。 此外,框架的源码还提供了一套易用的开发工具和开发规范,使开发者能够快速上手并高效地开发微服务应用。开发者可以根据自己的业务需求,选择合适的组件和模块进行使用,从而实现个性化的定制和扩展。 与其他微服务框架相比,javaweb_cloud_elevue_pro微服务框架的源码具有以下特点: 1. 高性能:框架使用了一系列优化的算法和技术,能够实现高效的请求处理和资源利用,保证系统的稳定和可靠。 2. 可扩展:源码提供了丰富的扩展接口和插件机制,开发者可以根据自己的需求进行个性化的扩展和定制。 3. 易用性:框架的源码结构清晰,文档详细,附带了示例和教程,使开发者能够快速理解和掌握框架的使用方法。 4. 社区支持:javaweb_cloud_elevue_pro框架拥有一个活跃的社区,开发者可以在社区中获取帮助、交流经验,并参与框架的改进和贡献。 总之,javaweb_cloud_elevue_pro微服务框架旗舰版源码提供了一个完整的微服务解决方案和一套易用的开发工具,可帮助开发者快速构建高性能、稳定可靠的分布式系统。它是微服务领域中的佼佼者,值得开发者深入研究和使用。 ### 回答3: javaweb_cloud_elevue_pro微服务框架旗舰版源码是一套用于构建微服务架构的开源代码。该框架旨在提供一种简单、高效的方式来搭建和管理分布式系统。 该框架基于Java语言,采用了云计算、分布式计算和微服务架构的设计理念,提供了一套完整的解决方案来构建和管理分布式应用。 该框架具有以下特点: 1. 架构灵活:框架提供了一套灵活的架构设计,可以根据业务需求进行扩展和定制。 2. 模块化设计:框架采用模块化设计,各个微服务模块之间可以独立部署和调用,实现了高内聚、低耦合的分布式系统。 3. 高可用性:框架支持负载均衡、容错和故障恢复等机制,保证了系统的高可用性和容错性。 4. 弹性扩展:框架支持水平扩展,可以根据需求动态增加或减少服务实例,实现了系统的弹性扩展和负载均衡。 5. 服务治理:框架提供了服务注册与发现、负载均衡、熔断器等功能,实现了对微服务的有效治理和管理。 6. 高性能:框架采用了高性能、高并发的设计和优化策略,提升了系统的性能和扩展能力。 总体而言,javaweb_cloud_elevue_pro微服务框架旗舰版源码是一套功能强大、灵活可扩展的微服务架构代码,可帮助开发人员快速构建和管理分布式系统。无论是在企业级应用程序还是在云计算环境中,该框架都能提供优秀的支持,并具有较高的性能和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Y_cen

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

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

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

打赏作者

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

抵扣说明:

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

余额充值