Springboot + SpringCloud + Nacos + OpenFeign + Gateway

根节点相关依赖

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.8</version><relativePath/> <!-- lookup parent from repository -->
</parent>
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2021.0.4.0</version><type>pom</type><scope>import</scope>
</dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>2021.0.5</version><type>pom</type><scope>import</scope>
</dependency>
  1. Nacos下载和安装

官网:https://nacos.io/zh-cn/

从GitHub下载对应版本nacos,版本对应关系:

https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E

cmd进入nacos/bin/目录

windows启动指令(单机模式):

startup.cmd -m standalone

以集群模式启动:

startup.cmd

停止运行:

shutdown.cmd

默认端口(集群需要复制多个安装包并修改端口,按实际情况修改):修改文件/conf/application.properties

server.port=8848

访问http://localhost:8848/nacos/index.html 进入服务中心管理页面,用户名和密码默认都为nacos,此时服务列表为空

  1. 服务发现(2021.0.4.0)

依赖:

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

在yml配置文件中配置服务中心地址和服务名称(必须),指定该服务端口号

spring:cloud:nacos:#服务中心server-addr: localhost:8848#discovery:#集群名称#cluster-name: USER#命名空间 相同命名空间可以互相访问#namespace: 156727b1-1778-482b-8c20-0321151d660b#ephemeral: falseapplication:name: user-service
server:port: 8002

成功启动项目后,管理台会看到该服务已注册到服务列表

指定命名空间后,不同命名空间的服务不能相互访问.

集群指定后,相当于分组,可以相互访问

  1. 服务间通信OpenFeign

服务间利用http请求进行通信,可以使用RestTemplate和OpenFeign

OpenFeign比RestTemplate有一定优势

OpenFeign依赖(3.1.5):

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

yml配置:

启动类添加启动Feign注解:

@EnableFeignClients

使用:"user-service"为目的目标服务名称,

@FeignClient("user-service")
public interface UserClient {@RequestMapping("/user/{id}")public String getUserById(@PathVariable("id") Long id);
}

注入到controller中

@Autowired
UserClient userClient;
String userById = userClient.getUserById(userId);

feign优化配置(默认使用Urlconnection,无连接池)

日志级别尽量用basic

使用 HttpClient 或 OKHttp 代替 URLConnection

日志打印使用基本配置,使用httpclient或者okhttp,启用连接池

导入httpclient依赖(11.10)

<!--feign 引入支持httpclient-->
<dependency><groupId>io.github.openfeign</groupId><artifactId>feign-httpclient</artifactId>
</dependency>
feign:httpclient:enabled: truemax-connections: 200max-connections-per-route: 50client:config:default:logger-level: basic

也可以在配置类中指定:

@Bean
public Logger.Level logLevel(){return Logger.Level.BASIC;
}

配置(客户端-service-service)负载均衡策略

导入依赖(高版本已移除ribbon)

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

创建配置文件

@Configuration
@LoadBalancerClients(defaultConfiguration = {NacosConfig.class})
public class NacosConfig {//2021版本已剔除ribbon/*** 配置客户端侧负载均衡规则 service-service*/@Beanpublic ReactorLoadBalancer<ServiceInstance> specLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory) {String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);return new RoundRobinLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);}
}
  1. 网关(单独服务)

网关也作为一个微服务需要注册到注册中心,纳入管理,实际项目中可以布置多套网关

依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId>
</dependency>
<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>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

配置端口和服务名称(必须),配置路由和跨域问题相关

server:port: 9000
spring:cloud:nacos:server-addr: localhost:8848gateway:routes:- id: user-serviceuri: lb://user-servicepredicates:- name: Pathargs:name: Pathvalue: /user/**- id: order-serviceuri: lb://order-servicepredicates:- name: Pathargs:name: Pathvalue: /order/**globalcors:# 跨域问题处理cors-configurations:'[/**]':#本次跨域检测有效期毫秒maxAge: 36000#是否允许携带cookieallowCredentials: true#允许请求携带的头信息allowed-headers:- "*"#允许哪些网站的跨域请求allowed-origins:- "http://localhost:8080"#允许的ajax请求方式allowed-methods:- "GET"- "POST"- "PUT"- "DELETE"- "OPTIONS"#解决options请求被拦截问题add-to-simple-url-handler-mapping: trueapplication:name: gateway-service

路由配置或者为

    gateway:routes:- id: user-serviceuri: lb://user-servicepredicates:- Path=/user/**- id: order-serviceuri: lb://order-servicepredicates:- Path=/order/**

-----------------------

断言工厂相关说明(简写方式)

predicates:
- Path=/provider/hello/**      #断言:路径相匹配进行路由
- Before=2021-08-25T12:53:46.101+08:00[Asia/Shanghai] #匹配这个时间之前的请求
- After=2021-08-25T12:53:46.101+08:00[Asia/Shanghai]  #匹配这个时间之后的请求
- Between=2021-08-25T12:53:46.101+08:00[Asia/Shanghai],2021-09-25T12:53:46.101+08:00[Asia/Shanghai] #匹配这个两个时间的请求
- Cookie=username,zzyy
- Header=X-Request-Id,\d+  #请求头要有 X-Request-Id 属性并且值为整数的正则表达式
- Host=**.atguigu.com
- Method=GET  #请求方式是 GET
- Query=username,\d+ #要有参数名 username 并且值还要是证书才能路由

因为网关实际上也是通过http和其他微服务通信,也可以配置负载均衡规则(service-service)

@Configuration
@LoadBalancerClients(defaultConfiguration = GatewayConfig.class)
public class GatewayConfig {@Beanpublic ReactorLoadBalancer<ServiceInstance> specLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory) {String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);return new RoundRobinLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);}
}

其他功能:过滤

yml中配置默认过滤default-filters

或配置全局过滤器,可以指定order

@Component
public class GatewayFilter implements GlobalFilter {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {ServerHttpRequest request = exchange.getRequest();ServerHttpResponse response = exchange.getResponse();log.info("gateway" + request.getURI().toString());return chain.filter(exchange);}
}

Springboot + SpringCloud + Nacos + OpenFeign + Gateway相关推荐

  1. 《黑马头条》SpringBoot+SpringCloud+ Nacos等企业级微服务架构项目

    01环境搭建.SpringCloud微服务(注册发现.服务调用.网关) 1)课程对比 2)项目概述 2.1)能让你收获什么 2.2)项目课程大纲 2.3)项目概述 随着智能手机的普及,人们更加习惯于通 ...

  2. 微服务01SpringCloud Eureka Ribbon Nacos Feign Gateway服务网关

    微服务技术栈导学 SpringCloud01 1.认识微服务 随着互联网行业的发展,对服务的要求也越来越高,服务架构也从单体架构逐渐演变为现在流行的微服务架构.这些架构之间有怎样的差别呢? 1.0.学 ...

  3. 熔断降级与限流在开源SpringBoot/SpringCloud微服务框架的最佳实践

    目录导读 熔断降级与限流在开源SpringBoot/SpringCloud微服务框架的最佳实践 1. 开源代码整体架构设计 2. 微服务逻辑架构设计 3. 微服务熔断降级与限流规划 3.1 微服务熔断 ...

  4. Springboot集成nacos实现服务发现和配置中心

    Nacos是阿里巴巴开源的服务发现和配置中心的中间件,springboot集成nacos比较方便,只需要以下三步: 1.依赖配置(pom文件) <properties><spring ...

  5. Java网络商城项目 SpringBoot+SpringCloud+Vue 网络商城(SSM前后端分离项目)十六(商品排序,Thymeleaf快速入门,商品详情页的展示)

    Java网络商城项目 SpringBoot+SpringCloud+Vue 网络商城(SSM前后端分离项目)十六(商品详情页的展示) 一.商品排序 1.完善页面信息 这是用来做排序的,默认按照综合排序 ...

  6. Nacos整合Gateway实现动态路由

    往期回顾 Nacos的安装与配置 Spring Cloud集成Nacos作为注册中心 LoadBalacer集成Nacos实现负载均衡 常见的负载均衡策略分析 Spring Cloud集成Dubbo实 ...

  7. 微服务学习笔记(二)Ribbon+OpenFeign+Gateway

    文章目录 4 Ribbon负载均衡 概述 RestTemplate 流程 策略 配置策略 饥饿加载 与Nginx对比 5 OpenFeign远程调用 RestTemplate调用的问题 与Feign对 ...

  8. Java网络商城项目 SpringBoot+SpringCloud+Vue 网络商城(SSM前后端分离项目)二十二(下单和微信支付)

    Java网络商城项目 SpringBoot+SpringCloud+Vue 网络商城(SSM前后端分离项目)二十(下单) 0.学习目标 会调用订单系统接口 实现订单结算功能 实现微信支付功能 1.订单 ...

  9. 解决SpringBoot+SpringCloud中feign调用服务传递参数为MultipartFile的问题

    文章目录 前言 一.前期说明 二.使用步骤 1.引入maven依赖 2.新建feign的配置类 2.feign客户端 3.被调用的服务的Controller 4.第三方服务远程调用主服务传递Multi ...

最新文章

  1. 万粉博主推荐,微信小程序 +Flask 后端调用 AnimeGanV2
  2. java url 拦截_Spring mvc设置某些url不被interceptor拦截器拦截的方法
  3. 【设计模式】业务代表模式
  4. 雷军:小米10是首款支持8x8 MU-MIMO的手机
  5. Android 5.0 最应该实现的8个期望
  6. @程序员们,华为员工 300 万分红,老板给你多少年终奖?
  7. Python中的字典数据结构
  8. Scrapy爬取多层级网页内容的方式
  9. fiddler使用详细教程
  10. CASS11:超越自我,再续辉煌!CASS10.1.6:延续经典,只为更好!
  11. 咖啡自由的六个阶段:无差别打击,你还能承受吗?
  12. 孤岛双馈风电机组数学模型matlab,大型变速双馈风电机组动态稳定性仿真分析
  13. 计算机进程管理与虚拟机实验答案,实验四虚拟机实验报告解读.doc
  14. 【渝粤题库】广东开放大学 物业管理实务 形成性考核
  15. java perfrences_Enterprise Resource Planning (ERP) | Oracle France
  16. phpstudy运行时显示3306端口被占用
  17. matlab 巴特沃斯滤波
  18. warning C4819 的解决方法
  19. 战高端,荣耀亮出“第二把剑”
  20. 【MySQL】sys系统库配置表

热门文章

  1. CuteOne:一款OneDrive多网盘挂载程序/带会员/同步等功能
  2. Python代码~加油
  3. 快排java实现图文解释
  4. 【C语言】【分治算法】循环赛日程安排问题
  5. Sectigo个人邮件签名流程
  6. Linux 上 postgresql 数据库迁移到 KingbaseES V8R6数据库
  7. 股票量化预测风险准不准?
  8. Android开发-差点儿被Logcat骗了,用Logcat输出一行有长度限制,用递归方式封装一个Logcat工具类
  9. 1个 pywinauto issue 和 Windows DPI 设置
  10. 域控制器的深度详解!