当前位置: 首页 > news >正文

dubbo:dubbo+nacos整合springcloud gateway实现网关(三)

文章目录

  • 0. 引言
  • 1. 集成gateway网关
    • 1.1 实操步骤
    • 1.2 dubbo提供者注册到nacos出现两个实例的问题
  • 2. 源码
  • 3. 总结

0. 引言

上次我们讲到使用zookeeper作为注册中心搭建dubbo微服务框架,但是我们还缺少一个服务总入口,也就是我们的网关服务。所以今天我们的目标就是给dubbo框架搭建一个网关。dubbo框架体系一般是结合nginx来作为网关的,但有时我们需要在网关拓展集成更多的功能,nginx可能无法满足,这是就可以结合springcloud gateway来实现

如果还不了解网关是什么的,可以先阅读我之前的博客

微服务基础概念

springcloud:网关组件gateway详解

dubbo+zookeeper+springcloud gateway是否可行?
因为很多企业在使用dubbo框架时都默认用zk来作为注册中心,很多小伙伴在集成网关时可能就想在dubbo+zk的基础上,集成gateway是否可行。

但实际上dubbo与gateway在使用zk时会出现冲突,从而导致使用报错,所以一般我们更加建议dubbo+zk+nginx,dubbo+nacos+gateway的组合方案

1. 集成gateway网关

1.1 实操步骤

因为之前我们已经讲解过spring cloud gateway组件的基本使用了,所以这次我们直接上手搭建网关

同时此次实操基于上次搭建的项目dubbo_wu_demo进行,参考:
dubbo整合nacos实现服务注册中心、配置中心(二)

1、首先我们需要创建一个springboot项目gateway

在这里插入图片描述

2、引入依赖
因为要引入springcloud gateway,所以我们现在根pom.xml里添加spring-cloud-dependencies的版本声明,这样引入gateway时就不用单独申明版本了

<properties><spring-cloud.version>Hoxton.SR9</spring-cloud.version></properties><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency>

在gateway项目pom中添加:

       <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>

注意这里不需要再引入spring-web依赖了,否则会因为冲突导致启动报错,spring-cloud-starter-gateway依赖中已经包含了spring-boot-starter-webflux,可以用于web容器启动

3、修改配置文件

server:port: 9090spring:cloud:nacos:discovery:username: nacospassword: nacosserver-addr: localhost:8848# 命名空间ID,默认为public命名空间,省略不写,命名空间ID在nacos-命名空间页面可以看到namespace:gateway:discovery:locator:enabled: true # 启用从服务发现中获取路由,默认按照服务名转发

4、gateway启动类添加上@EnableDiscoveryClient注释

5、因为服务都是基于springcloud的形式进行转发的,所以需要在之前创建user-server-nacos和order-server-nacos项目中添加上nacos discovery的配置,在项目资源目录下添加配置文件bootstrap.yaml,内容如下:

spring:cloud:nacos:config:server-addr: localhost:8848# 命名空间ID,默认为public命名空间,省略不写,命名空间ID在nacos-命名空间页面可以看到namespace:username: nacospassword: nacos# 文件名 如果没有配置则默认为服务名,即spring.appliction.nameprefix: order-server-nacos#指定文件后缀,默认propertiesfile-extension: yamldiscovery:username: nacospassword: nacosserver-addr: localhost:8848# 如果是public就不用填写了namespace:

6、为了方便测试,我们在order-server-nacos和user-server-nacos服务中都添加一个测试接口

	@Value("${server.port}")private Integer port;@Value("${spring.application.name}")private String serverName;@GetMapping("test")public String test(){return "调用服务" + serverName + ",端口:"+port;}

6、启动3个项目,通过gateway转发order-server-nacos, 即访问http://localhost:9090/order-server-nacos/test,如下图,可以看到正常转发了
在这里插入图片描述

1.2 dubbo提供者注册到nacos出现两个实例的问题

但是在转发http://localhost:9090/user-server-nacos/test时出现了报错IllegalArgumentException: invalid version format: UNSUPPORTED
在这里插入图片描述
然后二次访问又正常了
在这里插入图片描述
在这里插入图片描述
该问题的原因是因为user-server-nacos作为dubbo服务提供者,实际上在nacos有两种注册服务,在nacos管理端可以看到其实例:

第二种是springcloud形式注册到nacos的,第一种是dubbo形式注册到nacos, 很明显转发失败的就是转发到第一种上了

那么该问题该怎么解决呢?

因为该问题是因为dubbo注册服务和springcloud注册服务之间导致的冲突,相当于两个注册到一起了,形成了两个实例,那么思路就是让他们不要注册到一起。于是有两种解决方案:

  • 方案一:让dubbo服务名和springcloud服务名不一致

这个方式是最简单的,就是让spring.application.name和dubbo.application.name配置的服务名不要一样即可,这个就更改下配置文件即可
在这里插入图片描述
重启服务,可以看到服务示例分隔开了,gateway也正常了
在这里插入图片描述

在这里插入图片描述

  • 方案二:让dubbo和springcloud的nacos中的namespace不一致

我们之前在讲解nacos实现环境隔离时也说明过可以使用namespace来区分,那么这里也一样,我们可以定义不同的namespace,以此让其实例分隔开

可参考:springcloud gateway + nacos访问微服务出现invalid version format: UNSUPPORTED

(1)nacos新建一个namespace
在这里插入图片描述
(2)复制其ID, 填写到配置bootstrap.yaml文件中(也可以选择更改dubbo.registry.parameters.namespace),注意这里不是填写命名空间名,而是其ID
在这里插入图片描述
在这里插入图片描述
同时gateway、order-server-nacos其他服务的namespace也要更改,不然因为不统一也会导致找不到服务

在这里插入图片描述
调整后访问正常
在这里插入图片描述

2. 源码

文中源码,可在https://gitee.com/wuhanxue/dubbo_wu_demo下载

3. 总结

至此,我们结合gateway实现的网关就搭建完成了, 如果要实现限流、自定义路由、过滤器等各种网关操作,大家可以结合文章开头列出的gateway组件详解一文

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 应用商场的搭建
  • Git Submodule 常用命令详解
  • FastGPT如何增减用户
  • React项目-less、antd配置
  • 半路出家程序员感受:非科班出身如何转行程序员? 答案在这
  • VTK随笔一:初识VTK(QT中嵌入VTK窗口)
  • Java方法的使用
  • 快排里面找基准值的算法
  • threadlocal的一些用法,以及如何解决可重入分布式redis锁
  • springboot系列教程(三十二):SpringBoot 教程之处理异步请求
  • Clickhouse篇之数据的备份与恢复
  • 基于R语言的统计分析基础:数据结构
  • Python编码系列—Python CI/CD 实战:构建高效的自动化流程
  • [数据集][目标检测]电力场景输电线异物检测数据集VOC+YOLO格式2060张1类别
  • html+css网页制作 自定义网站 钻石戒指:专业领域应用现状、前沿及发展展望、10个页面
  • 【391天】每日项目总结系列128(2018.03.03)
  • 30天自制操作系统-2
  • Consul Config 使用Git做版本控制的实现
  • js如何打印object对象
  • mysql外键的使用
  • Octave 入门
  • php的插入排序,通过双层for循环
  • SAP云平台里Global Account和Sub Account的关系
  • Sequelize 中文文档 v4 - Getting started - 入门
  • ViewService——一种保证客户端与服务端同步的方法
  • VuePress 静态网站生成
  • windows-nginx-https-本地配置
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 不上全站https的网站你们就等着被恶心死吧
  • 两列自适应布局方案整理
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 如何利用MongoDB打造TOP榜小程序
  • 深入浏览器事件循环的本质
  • 实习面试笔记
  • 使用parted解决大于2T的磁盘分区
  • 温故知新之javascript面向对象
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • (03)光刻——半导体电路的绘制
  • (24)(24.1) FPV和仿真的机载OSD(三)
  • (Java入门)学生管理系统
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (STM32笔记)九、RCC时钟树与时钟 第二部分
  • (笔试题)分解质因式
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (七)Flink Watermark
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (一)基于IDEA的JAVA基础12
  • (转)Google的Objective-C编码规范
  • (转)程序员疫苗:代码注入
  • (轉)JSON.stringify 语法实例讲解
  • .JPG图片,各种压缩率下的文件尺寸