本示例服务注册中心使用nacos-discovery
,配置中心使用nacos-config
,网关使用Spring Clound Gateway
,服务间调用使用Feign
。
示例中会创建 3 个服务:gateway-demo(网关)、demo1(服务1)和 demo2(服务2),其中 gateway-demo 使用 8080 端口,demo1 使用 8081 端口,demo2 使用 8082 端口。
1、启动 nacos server (本示例 nacos-server 安装在本地)并创建上述 3 个服务对应的配置文件
gateway-demo.yml
spring:
cloud:
gateway:
routes:
- id: route1
uri: http://localhost:8081
filters:
- StripPrefix=0
predicates:
- Path=/demo1/**
- id: route2
uri: http://localhost:8082
filters:
- StripPrefix=0
predicates:
- Path=/demo2/**
文件中配置了 demo1 和 demo2 两个路由。
demo1.yml
author:
name: young1
demo2.yml
author:
name: young2
demo1,demo2 配置文件中简单配置了一个属性,用于后续测试能否正常读取 nacos 上的配置文件用。
2、创建网关服务 gateway-demo
使用 Spring Initializr 创建项目,完成后添加nacos-discovery
,nacos-config
以及Spring Clound Gateway
依赖
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
2.2.1.RELEASE
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-config
2.2.1.RELEASE
org.springframework.cloud
spring-cloud-starter-gateway
2.2.5.RELEASE
注意:SpringBoot
和 SpringClound
之间版本冲突问题,本示例 SpringBoot
使用 2.2.5.RELEASE 版本。且网关服务中如果有对spring-boot-starter-web
的依赖则需要排除该依赖,因为它会与 Spring Cloud Gateway 的 webflux 冲突。
编辑配置文件 bootstrap.yml
server:
port: 8080
spring:
application:
name: gateway-demo
cloud:
nacos:
config:
server-addr: localhost:8848
file-extension: yml
discovery:
server-addr: localhost:8848
3、创建 demo1 服务
使用 Spring Initializr 创建 Spring Web 项目,完成后添加nacos-discovery
,nacos-config
以及Feign
依赖
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
2.2.1.RELEASE
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-config
2.2.1.RELEASE
org.springframework.cloud
spring-cloud-starter-openfeign
2.2.5.RELEASE
编辑配置文件 bootstrap.yml
server:
port: 8081
spring:
application:
name: demo1
cloud:
nacos:
config:
server-addr: localhost:8848
file-extension: yml
discovery:
server-addr: localhost:8848
在 demo1 启动类上添加@EnableFeignClients
注解,启用 Feign。
新建 FeignClient 类
@FeignClient("demo2")
public interface RemoteService {
/**
* 获取其他服务数据
*
* @return String
*/
@GetMapping("/remote/method")
String getDataFromRemote();
}
新建远程调用 Controller
@RestController
@RequestMapping("/remote")
public class RemoteController {
@GetMapping("/method")
public String method() {
return "data from demo1";
}
}
新建测试 Controller
@RestController
@RequestMapping("/test")
public class TestController {
@Value("${author.name}")
private String authorName;
@Autowired
private RemoteService remoteService;
@GetMapping("/method")
public String method() {
return "demo1 content: " + authorName + ", feign call result: " +
remoteService.getDataFromRemote();
}
}
4、创建 demo2 服务
编辑配置文件
server:
port: 8082
spring:
application:
name: demo2
cloud:
nacos:
config:
server-addr: localhost:8848
file-extension: yml
discovery:
server-addr: localhost:8848
其他各文件代码参考 demo1
5、运行各服务测试
分别运行上面创建的 3 个服务,如果运行正常,我们在 nacos-server 上(http://localhost:8848/nacos/index.html)的服务列表中可以看到服务名分别为gateway-demo
、demo1
、demo2
的 3 个服务。
然后访问 http://localhost:8080/demo1/test/method,可以看到如下内容:
demo1 content: young1, data from demo2: demo2 feign调用返回结果
再访问 http://localhost:8080/demo2/test/method
demo2 content: young2, data from demo1: demo1 feign调用返回结果
可以看到 demo1 和 demo2 都可通过网关正常访问,还可以正确读取 nacos 配置文件里的配置项,并且 demo1 和 demo2 之间也可以通过 Feign 互相调用对方的方法。