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

news2024/11/26 20:33:58

文章目录

  • 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: 9090

spring:
  cloud:
    nacos:
      discovery:
        username: nacos
        password: nacos
        server-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: nacos
        password: nacos
        # 文件名 如果没有配置则默认为服务名,即spring.appliction.name
        prefix: order-server-nacos
        #指定文件后缀,默认properties
        file-extension: yaml
      discovery:
        username: nacos
        password: nacos
        server-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组件详解一文

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2060923.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小兔鲜首页制作css

一、项目目录 项目名-客户端 xtx-pc 1.images&#xff1a;存放固定使用的图片&#xff0c;例如&#xff1a;logo、样式修饰图 2.uploads:存放非固定图片&#xff0c;例如&#xff1a;商品图、宣传图等需要上传的图片 3.iconfont:字体图标素材 4.css文件&#xff1a; 4.1base.cs…

猫咪除毛除臭大作战!宠物空气净化器帮助铲屎官轻松应对换毛季

最近天气真的好热&#xff0c;可以的话真想呆在空调房一直不出来&#xff0c;人都受不了&#xff0c;何况是一身厚重毛发的猫咪。这不&#xff0c;本该在春季结束的换毛季&#xff0c;延续到了夏天。它就像一个行走的蒲公英&#xff0c;家里到处散落着它的毛发。体臭和便臭在密…

【软件测试·研究向】Major 变异测试工具使用教程

目录 前言 1 安装 1.1 下载解压 1.2 配置环境变量 1.3 入门示例脚本 2 Mutator Plugin 编译器插件 2.1 如何使用插件&#xff1f; 2.2 插件配置选项 2.3 Major 支持的变异算子 2.4 突变体的日志记录 2.5 生成突变体的源代码 3 构建系统集成 4 Major 突变语言 (M…

系统架构设计师:信息系统概述及分类

信息系统是由计算机硬件、网络和通信设备、计算机软件、信息资源、信息用户和规章制度组成的以处理信息流为目的的人机一体化系统。 从技术上可以定义为一系列支持决策和控制的相关要素&#xff0c;这些要素主要包括信息的收集、检索、加工处理和信息服务。除了支持决策、协作…

【Python】动态类型、输入和输出、条件语句

动态类型 程序运行过程中&#xff0c;变量的类型可能会发生改变 a hello print(a) a 10 print(a)#运行结果 hello 10在程序执行过程中&#xff0c;a 的类型刚开始是 int&#xff0c;后面变成了 str C / Java 这样的语言则不允许这样的操作&#xff0c;一个变量定义后类…

Qt第十七章 多线程

文章目录 多线程1. 线程概念的起源2. 三种方式创建线程3. 启动线程前的准备工作4. 启动线程/退出线程5. 操作运行中的线程6. 为每个线程提供独立数据7.子线程不能操作ui解决方案 多线程 1. 线程概念的起源 单核CPU 早期还没有线程的概念&#xff0c;如何保证2个进程同时进行呢…

BaseCTF 高校联合新生赛Week1(web)

目录 HTTP 是什么呀 喵喵喵•&#xfecc;•​编辑 md5绕过欸 A Dark Room upload Aura 酱的礼物 HTTP 是什么呀 url转义&#xff1a; 是将URL中的特殊字符转换为有效的ASCII字符格式的过程&#xff0c;以确保URL的正确解析和传输。这个过程涉及到将非ASCII字符替换为“%h…

【论文阅读】通用的语义-几何表征的机器人操作

文章目录 1. 【2023CoRL】A Universal Semantic-Geometric Representation for Robotic Manipulation针对痛点和贡献引言模型框架思考不足之处 2. Leveraging Locality to Boost Sample Efficiency in Robotic Manipulation摘要和结论引言模型框架实验思考不足之处 1. 【2023Co…

哈希表的查找、插入及删除——217、633、349、128、202、500,290、532、205(五简四中)

217. 存在重复元素&#xff08;简单&#xff09; 给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 &#xff0c;返回 true &#xff1b;如果数组中每个元素互不相同&#xff0c;返回 false 。 解法一、哈希 无则加入&#xff0c;有则代表重复&#xff0c;返回true …

Vue自定义横向轮播图

目录 前言代码效果演示详细代码实现思路轮播图实现代码组件使用代码前言 汇总一个最近写出来的效果,最新的设计稿里面要求实现一个轮播图,原本使用的Element-UI提供的轮播图不是很适配,所以选择自定义一个使用。文中附带代码实际效果演示视频。 大致需求就是:一行10个d…

敲桌子游戏

题目 在饭局上&#xff0c;会玩一种敲桌子的游戏&#xff0c;从1报数到100&#xff0c;如果报到个位含有7&#xff0c;或者十位含有7&#xff0c;或者7的倍数的数字&#xff0c;则报数人不能报出该数字&#xff0c;而是敲桌子代替。如果违反了规则&#xff0c;则进行一定的惩罚…

【python】逐步回归(多元线性回归模型中的应用)

文章目录 前言一、逐步回归1. 前进法&#xff08;Forward Selection&#xff09;2. 后退法&#xff08;Backward Elimination&#xff09;3. 逐步回归法&#xff08;Stepwise Regression&#xff09; 二、示例三、代码实现----python 前言 Matlab中逐步回归的实现可以使用 Mat…

流量分析-Windows

目录 介绍步骤 介绍 1、Medusa工具是通过并行登陆暴力破解的方法&#xff0c;尝试获取远程验证服务访问权限&#xff0c;它支持AFP, CVS, FTP, HTTP, IMAP, MS-SQL, MySQL, NCP (NetWare),NNTP, PcAnywhere, POP3, PostgreSQL, rexec, rlogin, rsh, SMB, SMTP(AUTH/VRFY), SNM…

【Windows下Oracle 11G 安装教程】

Windows下 Oracle 11G 安装及配置教程 引言数据库安装安装流程1.运行可执行程序2.取消安装更新配置3.安装及配置数据库4.选择系统的类别5.安装位置及全局数据库6.检查配置及设置情况7.配置对应数据库管理的密码 引言 在网上各种安装教程其实已经很多了&#xff0c;没必要再出这…

共享内存及网络通信

共享内存 ------ 最高效的进程间通信 一个内核预留的空间&#xff0c;两进程绑定同一块共享空间 避免了用户空间 到 内核空间的数据拷贝 IPC 操作流程 key值 > 申请 >读写 >关闭 >卸载 1,产生key值 函数ftok key_t ftok(const char *pathname, int proj_id);…

谷粒商城实战笔记-230-商城业务-认证服务-页面效果完成

这一节主要是完善各种页面效果。 一&#xff0c;用户名密码登录接口存放session 之前是在微博登录成功后把用户信息放入session&#xff0c;用户名密码登录成功也需要把用户信息放入session。 PostMapping(value "/login")public String login(UserLoginVo vo, R…

江协科技STM32学习- P5 GPIO输出

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

坐牢第二十九天

思维导图 作业 作业&#xff1a; 运行1个服务器和2个客户端 实现效果&#xff1a; 服务器和2个客户端互相聊天&#xff0c;服务器和客户端都需要使用select模型去实现 服务器要监视2个客户端是否连接&#xff0c;2个客户端是否发来消息以及服务器自己的标准输入流 客户端要监视…

nginx-Web 服务端

nginx的简介 Nginx 是一款高性能的 Web 服务器和反向代理服务器。 高并发处理能力&#xff1a;采用异步非阻塞的方式处理请求&#xff0c;能够在高并发场景下快速响应。 轻量级和高效&#xff1a;资源消耗相对较少&#xff0c;启动速度快。 优秀的反向代理和负载均衡功能&a…

2053. 图的bfs遍历

代码 #include<bits/stdc.h> using namespace std; int a[20][20],q[20]; bool f[20]; int main() {int h,t,n,e,x,y,i;cin>>n>>e;for(i1;i<e;i){cin>>x>>y;a[x][y]1;a[y][x]1;}h1;t1;q[1]1;f[1]true;cout<<1<<" ";wh…