SpringCloud与Nacos动态路由问题

标签: Springboot 分类: Java 创建时间:2020-06-01 04:47:15 更新时间:2024-11-15 10:49:43

这篇文章是接上一篇文章(SpringCloud与Nacos动态路由),继续编写的问题解决方案。

(2) Unable to find instance for bigdata
在我第一次创建网关的时候,可以使用lb协议,但是等我第二次再重新创建一个新的模块的时候,无论如何都搞不定了。显示找不到实例

改了几次名字之后,还是不行。为什么同样的代码就是无法找到实例了呢?还有一个奇怪的就是当我只使用gateway.discovery.locator.enabled=true配置,直接使用服务名进行路由的时候,却是能找到这个名字的微服务的。

解决方法:主要是要添加gateway.discovery.locator.enabled=false属性,然后再配置路由解析。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
server:
port: 7004
spring:
application:
name: test
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
ip: 127.0.0.1
gateway:
## gateway:discovery:locator:enabled:true这样就可以利用微服务名进行路由
discovery:
locator:
enabled: false
routes:
- id: url-proxy-1
uri: lb://bigdata
predicates:
- Path=/lsmfhx/bigdata/**
filters:
- StripPrefix=1

奇怪的事情发生了,当我把这段代码删掉之后,或者是复制到另一个项目中的时候,另一项目还是会出现503错误,而这个项目已经运行起来的,还是可以继续运行,即使删掉代码,执行了mvn clean package ,还是能找到服务名。这是缓存吗?不能执行的那个程序,无论怎么改程序,都是返回404错误。

简直令人抓狂和无可奈何啊,在另一个项目中gateway.discovery.locator.enabled=true这个好像也不管事了。

时隔两天后,我再次修改代码,基本上没怎么变化的,就是动态路由的json参数发生了变化,写成了如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[
{
"id": "lsmfhx-phemsjava",
"order": 1,
"predicates": [{
"args": {
"pattern": "/lsmfhx/bigdata/searchHistoryAll"
},
"name": "Path"
}],
"filters":[{
"name":"StripPrefix",
"args":{
"_genkey_0":1
}
}],
"uri": "lb://bigdata"
}
]

主要的问题到底出在那里,这个test工程为什么可以,而另一个同样差不多代码的工程,就不行呢?

经过重复实验和另开应用程序,我发现了可能是pom的问题。

1.pom.xml文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
<relativePath/>
</parent>

<modelVersion>4.0.0</modelVersion>

<artifactId>test</artifactId>
<packaging>jar</packaging>
<description>网关</description>

<properties>
<java.version>1.8</java.version>
</properties>

<dependencyManagement>

<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>0.2.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>


<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

</project>

错误的pom.xml,是只引入了下面两个依赖,缺少了spring-cloud-starter-alibaba-nacos-discovery依赖

1
2
3
4
5
6
7
8
9
10
11
<dependencies>
<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-config</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
</dependencies>

2.配置文件application.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
server:
port: 7006
spring:
application:
name: gateway
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
ip: 127.0.0.1
nacos:
config:
server-addr: 127.0.0.1:8848 #nacos的serverAdd配置
group: DEFAULT_GROUP #分组的配置
file-extension: json
data-id: route-list #data-id的配置

3.bootstrap.properties配置文件

1
spring.cloud.nacos.config.server-addr=127.0.0.1:8848

这样就再加上(SpringCloud与Nacos动态路由二)文章中,添加的NacosGatewayDefineConfig、NacosDynamicRouteService以及NacosDynamicRouteServiceImpl 三个类,就构成了完整的nacos作为配置中心,加上gateway做网关的动态路由解决方案。代码地址

参考文章:
1.RouteDefinition
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。