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组件详解一文

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

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

相关文章

速盾:cdn能防ip追踪吗?

CDN&#xff0c;即内容分发网络&#xff08;Content Delivery Network&#xff09;&#xff0c;是一种通过网络分布在多个地理位置的服务器集群来提供高效内容传输服务的技术。CDN的主要目的是通过就近提供内容来加快网站的加载速度&#xff0c;并减少因服务器过载而导致的延迟…

DataWhale AI夏令营-《李宏毅深度学习教程》笔记

DataWhale AI夏令营-《李宏毅深度学习教程》笔记 第三章 深度学习基础补充一些基础临界点及其种类逃离临界点方法批量动量自适应学习率学习率调度 之前一直接触的LLM大模型做一些应用&#xff0c;或者传统的自然语言处理&#xff0c;都是直接拿别人的模型用&#xff0c;要不就是…

2024.8.23 刷题总结

2024.8.23 **每日一题** 198.打家劫舍&#xff0c;这道题是一道简单的入门动态规划问题&#xff0c;根据题目意思&#xff0c;我们不能取数组中相邻的元素然后还必须满足总结果最大&#xff0c;所以我们可以维护一个数组&#xff0c;用来保存在数组每个位置之前能取到的最大值&…

【openwrt-21.02】openwrt-21.02 T750 按键GPIO自动进入刷机模式功能实现

Openwrt版本 NAME="OpenWrt" VERSION="21.02-SNAPSHOT" ID="openwrt" ID_LIKE="lede openwrt" PRETTY_NAME="OpenWrt 21.02-SNAPSHOT" VERSION_ID="21.02-snapshot" HOME_URL="https://openwrt.org/" …

k8s 部署Ruoyi-Vue-Plus之vue打包镜像

在这里插入图片描述 在这篇文章中&#xff0c;解释如何通过容器化&#xff08;Docker&#xff09;来打包和部署前端项目&#xff0c;替代之前手动维护版本的方式 1.nginx配置 在 ruoyi-ui 项目的根目录下创建一个 nginx.conf 文件, 我没有使用monitor-admin和xxljob-admin模块…

maven 从特定module(项目)重新开始编译

前言 一般情况下&#xff0c;多module的项目数量过少&#xff0c;可能不需要使用到这个功能&#xff0c;但是当项目过多就很有必要&#xff0c;例如有20个module 编译到最后一个报错了&#xff0c;那重新构建的话 就会从第一个项目再来一遍&#xff0c;是不是很烦躁。 实践 …

语言基础/单向链表的构建和使用(含Linux中SLIST的解析和使用)

文章目录 概述简单的链表描述链表的术语简单实现一个单链表 Linux之SLIST机理分析结构定义单链表初始化单链表插入元素单链表遍历元素单链表删除元素 Linux之SLIST使用实践纯C中typedef重命名带来的问题预留 概述 本文讲述了数据结构中单链表的基本概念&#xff0c;头指针、头…

分发糖果

题目 老师想给孩子们分发糖果&#xff0c;有 N 个孩子站成了一条直线&#xff0c;老师会根据每个孩子的表现&#xff0c;预先给他们评分。 你需要按照以下要求&#xff0c;帮助老师给这些孩子分发糖果&#xff1a; 每个孩子至少分配到 1 个糖果。评分更高的孩子必须比他两侧…

前端面试——什么是原型和原型链

背景 最近看到了很有意思的东西&#xff0c;原型和原型链 我们首先看看MDN怎么讲&#xff1a;继承与原型链 - JavaScript | MDN 不过文档里面也没有给出原型的定义&#xff1f;&#xff1f;&#xff1f; 不过里面提到原型链&#xff0c;是指对象层层向上寻找原型形成的路径…

CPP中lamada表达式作用一览[more cpp-6]

一般语法 CPP中的lambda 表达式的本质就是匿名函数&#xff0c;它可以在代码中定义一个临时的、局部的函数.为什么需要lamada表达式&#xff1f; 因为命名是个大问题 想名字以及避免命名冲突是很劳神费力的事&#xff0c;这就是lamada表达式的优点(lamada优点表现为简洁性)总…

如何在不格式化的情况下解锁 Android 智能手机密码

如果您忘记密码&#xff0c;您的 Android 移动设备将锁定您。发生这种情况时&#xff0c;通常可以通过恢复出厂设置来重新获得对设备的访问权限。可悲的是&#xff0c;这将导致所有数据丢失。下面列出的是解锁锁定的Android 手机而不会丢失任何个人数据的有效方法。 Android 手…

编程学习中的“知识宝库”打造秘籍

编程学习中的“知识宝库”打造秘籍 在编程学习的道路上&#xff0c;我们犹如航海家在知识的海洋中探索前行。而高效的笔记记录和整理方法&#xff0c;无疑就是那张珍贵的航海图&#xff0c;引领我们在浩瀚的编程知识海洋中找到方向。 一、为什么需要一个好的笔记系统 编程知…

Ps:首选项 - 界面

Ps菜单&#xff1a;编辑/首选项 Edit/Preferences 快捷键&#xff1a;Ctrl K Photoshop 首选项中的“界面” Interface选项卡可以定制 Photoshop 的界面外观和行为&#xff0c;从而创建一个最适合自己工作习惯和需求的工作环境。这些设置有助于提高工作效率&#xff0c;减轻眼…

单片机外部中断+定时器实现红外遥控NEC协议解码

单片机外部中断定时器实现红外遥控NEC协议解码 概述解码过程参考代码 概述 红外(Infrared&#xff0c;IR)遥控&#xff0c;是一种通过调制红外光实现的无线遥控器&#xff0c;常用于家电设备&#xff1a;电视机、机顶盒等等。NEC协议采用PPM(Pulse Position Modulation&#x…

算法题目杂记

差分 来源 https://www.acwing.com/problem/content/799/ 题目 输入一个长度为 n的整数序列。 接下来输入 m个操作&#xff0c;每个操作包含三个整数 l,r,c&#xff0c;表示将序列中 [l,r] 之间的每个数加 c。 请你输出进行完所有操作后的序列。 输入格式 第一行包含两个整数…

Vue的计算属性:methods方法、computed计算属性、watch监听属性

1、methods 方法 在创建的 Vue 应用程序实例中&#xff0c;可以通过 methods 选项定义方法。应用程序实例本身会代理 methods 选项中的所有方法&#xff0c;因此可以像访问 data 数据那样来调用方法。 【实例】在 Vue 应用程序中&#xff0c;使用 methods 选项定义获取用户信…

实验16:定时器中断实验

无硬件图&#xff0c;用到D1灯 代码main.c #include<reg52.h>typedef unsigned int u16; typedef unsigned char u8;sbit LED1P2^0;void delay_10us(u16 n) {while(n--); }void delay_ms(u16 ms) {u16 i,j;for(ims;i>0;i--)for(j110;j>0;j--); }void time0_init(v…

使用命令模式实现撤销与重做功能的完整指南

使用命令模式实现撤销与重做功能的完整指南 命令模式是一种行为型设计模式&#xff0c;它将请求封装成对象&#xff0c;以便于对请求进行参数化、排队和记录。命令模式不仅有助于实现撤销和重做功能&#xff0c;还能提高系统的灵活性和可维护性。在本文中&#xff0c;我们将详…

2月公开赛Web-ssrfme

考点&#xff1a; redis未授权访问 源码&#xff1a; <?php highlight_file(__file__); function curl($url){ $ch curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_HEADER, 0);echo curl_exec($ch);curl_close($ch); }if(isset($_GET[url…

数据结构-返回n年后牛的数量

第一年农场有1只成熟的母牛A,往后的每年: 每一只成熟的母牛都会生一只母牛每一只新出生的母牛都在出生的第三年成熟每一只母牛永远不会死 返回N年后牛的数量。 抽象公式就是 F(N) F(N-1) F(N-3). 矩阵公式: |F4, F3, F2| |F3,F2,F1| * 3阶矩阵 |F5, F4, F3| |F4,F3,F2| …