Nacos集成Spring Cloud Gateway使用第二章:上手demo
本次demo为Nacos集成Spring Cloud Gateway,并且使用openfeign实现服务间的相互调用
如需要查看理解: 上一章:Nacos集成Spring Cloud Gateway使用第一章:理解解释
如需引用nacos的配置中心则查看下一章:Nacos集成Spring Cloud Gateway使用第三章:nacos配置中心
nacos安装的教程 直接根据官网的一步步来吧 https://nacos.io/zh-cn/docs/quick-start.html
1.新建一个springcloud项目
内涵一个网关 两个服务
1.1 父类pom
<?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"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>nacos-gateway</artifactId> <version>1.0-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.12.RELEASE</version> <relativePath/> </parent> <modules> <module>gateway</module> <module>serverone</module> <module>servertwo</module> </modules> <dependencies> <!-- spring-cloud --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Greenwich.SR3</version> <type>pom</type> <scope>import</scope> </dependency> <!--注册中心 实现服务的注册与发现 注意:版本 2.1.x.RELEASE 对应的是 Spring Boot 2.1.x 版本。版本 2.0.x.RELEASE 对应的是 Spring Boot 2.0.x 版本,版本 1.5.x.RELEASE 对应的是 Spring Boot 1.5.x 版本。 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>2.1.2.RELEASE</version> </dependency> <!-- spring-boot-test --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> </project>
1.2 网关层服务
pom文件
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <!-- 我是一个模拟注册nacos的一个服务 ,网关层 --> <parent> <groupId>org.example</groupId> <artifactId>nacos-gateway</artifactId> <version>1.0-SNAPSHOT</version> </parent> <groupId>com.demo</groupId> <artifactId>gateway</artifactId> <version>0.0.1-SNAPSHOT</version> <name>gateway</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <!-- 网关 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> <version>2.1.3.RELEASE</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
yml配置文件
server: port: 13008 spring: application: name: gateway cloud: nacos: discovery: server-addr: 自己nacos的地址 ip: 127.0.0.1 group: gatewaynacos namespace: demo gateway: discovery: locator: #是否与服务发现组件进行结合,通过 serviceId 转发到具体的服务实例。默认为false,设为true便开启通过服务中心的自动根据 serviceId 创建路由的功能 enabled: true #开启小写,#路由访问方式:http://Gateway_HOST:Gateway_PORT/大写的serviceId/**,其中微服务应用名默认大写访问。 lower-case-service-id: true routes: #第一个服务的路由规则 - id: serverone # uri以lb://开头(lb代表从注册中心获取服务),后面接的就是你需要转发到的服务名称 uri: lb://serverone predicates: #以后访问 http://127.0.0.1:13008/serverone/one/hello/two,ip:端口/自定义path/接口地址 - Path=/serverone/** #第二个服务的路由规则 - id: servertwo uri: lb://servertwo predicates: - Path=/servertwo/**
gateway启动类文件
package com.demo.gateway; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @SpringBootApplication @EnableDiscoveryClient //开启服务注册发现功能 public class GatewayApplication { public static void main(String[] args) { SpringApplication.run(GatewayApplication.class, args); } }
1.3 第一个服务
pom文件
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <!-- 我是一个模拟注册nacos的一个服务 --> <parent> <groupId>org.example</groupId> <artifactId>nacos-gateway</artifactId> <version>1.0-SNAPSHOT</version> </parent> <groupId>com.demo</groupId> <artifactId>serverone</artifactId> <version>0.0.1-SNAPSHOT</version> <name>serverone</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> <version>2.1.3.RELEASE</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
ServeroneApplication
package com.demo.serverone; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.openfeign.EnableFeignClients; @SpringBootApplication @EnableDiscoveryClient //开启服务注册发现功能 @EnableFeignClients public class ServeroneApplication { public static void main(String[] args) { SpringApplication.run(ServeroneApplication.class, args); } }
OneHelloController
package com.demo.serverone; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping(value = "one") public class OneHelloController { @Autowired public ServiceClient serviceClient; @GetMapping("/hello") public String hello(){ return "hello,我是1号"; } @GetMapping("/hello/two") public void hellotwo(){ serviceClient.test("hello2号,我是从1号来的"); } }
ServiceClient
package com.demo.serverone; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; @FeignClient(value = "servertwo") public interface ServiceClient { @GetMapping(value = "/two/hello/one") void test(@RequestParam(value = "test")String test); }
application.yml
server: port: 9088 spring: application: name: serverone cloud: nacos: discovery: server-addr: 自己的nacos地址 改成自己的 ip: 127.0.0.1 group: gatewaynacos namespace: demo
1.4 第二个服务
pom
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <!-- 我是一个模拟注册nacos的一个服务 --> <parent> <groupId>org.example</groupId> <artifactId>nacos-gateway</artifactId> <version>1.0-SNAPSHOT</version> </parent> <groupId>com.demo</groupId> <artifactId>servertwo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>servertwo</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> <version>2.1.3.RELEASE</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
application.yml
server: port: 9087 spring: application: name: servertwo cloud: nacos: discovery: server-addr: nacos的地址 改成自己的 ip: 127.0.0.1 group: gatewaynacos namespace: demo
ServertwoApplication
package com.demo.servertwo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @SpringBootApplication @EnableDiscoveryClient //开启服务注册发现功能 public class ServertwoApplication { public static void main(String[] args) { SpringApplication.run(ServertwoApplication.class, args); } }
TwoHelloController
package com.demo.servertwo; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping(value = "two") public class TwoHelloController { @GetMapping("/hello") public String hello() { return "hello,我是2号"; } @GetMapping("/hello/one") public void helloOne(@RequestParam(value = "test") String test) { System.out.println(test); } }
测试:
创建完成后,会在nacos里面看到自己注册的服务
测试可以通过网关访问到第一个服务,ip+网关端口/自己定义的服务名/接口
尝试从第一个服务调用第二个服务,直接打开网址或者自己测试类随便 http://127.0.0.1:13008/serverone/one/hello/two
ok 成功。