上篇我们讲述了Java程序如何注册到nacos集群并调用集群中的配置。本篇主要讲述Java程序之间如何调用。SpringCloudAlibaba官方示例使用的是LoadBalanceClient 和 RestTemolate例子,有兴趣的同学可以去githup查看官方示例。
https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-discovery
这边分享的是使用OpenFeign。
提供者
项目右击新建Module,项目名称为Products,创建成功后更改pom.xml文件。配置如下
<?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>
<parent>
<groupId>com.juwusheng</groupId>
<artifactId>springcloudalibabademo</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.juwusheng</groupId>
<artifactId>users</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>users</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--引入nacos client的依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--导入openfeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
创建bootstrap.yaml资源文件,放在src/main/resources文件下。application.properties重命名为application.yaml,并清空文件中的内容。bootstrap.yaml增加配置
server:
port: 9090
spring:
application:
name: PRODUCTS
cloud:
nacos:
discovery:
namespace: bf3b249f-ee29-4c7c-af98-fa5c2b4fb568
config:
namespace: bf3b249f-ee29-4c7c-af98-fa5c2b4fb568
group: DEFAULT_GROUP
name: product-dev
file-extension: yaml
server-addr: 192.168.43.85:8845,192.168.43.229:8846,192.168.43.251:8847
management:
endpoints:
web:
exposure:
include: "*"
新建一个ProductsController的类,代码如下
@RestController
@RefreshScope
public class ProductsController {
@Value("${server.port}")
private int port;
@Value("${goods.name}")
private String goodsName;
@GetMapping("/product/{id}")
public String products(@PathVariable("id") Integer id){
return "当前商品名称:"+goodsName+"调用商品服务返回:"+id+",当前提供服务的端口为:"+port;
}
}
启动类中增加EnableDiscoveryClient注解。
nacos中配置管理新建一个Data ID名称为product-dev.yaml,配置内容添加”goods.name = JAVA从入门到放弃“的配置。
消费者
项目右击新建Module,项目名称为Users,创建成功后更改pom.xml文件。配置如下
<?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>
<parent>
<groupId>com.juwusheng</groupId>
<artifactId>springcloudalibabademo</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.juwusheng</groupId>
<artifactId>users</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>users</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--引入nacos client的依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--导入openfeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
创建bootstrap.yaml资源文件,放在src/main/resources文件下。application.properties重命名为application.yaml,并清空文件中的内容。bootstrap.yaml增加配置
server:
port: 8989
spring:
application:
name: USERS
cloud:
nacos:
discovery:
namespace: bf3b249f-ee29-4c7c-af98-fa5c2b4fb568
server-addr: 192.168.43.85:8845,192.168.43.229:8846,192.168.43.251:8847
management:
endpoints:
web:
exposure:
include: '*'
创建ProductClient接口,配置如下
@FeignClient("PRODUCTS")
public interface ProductClient {
@GetMapping("/product/{id}")
String products(@PathVariable("id") Integer id);
}
这里的接口要和Module名为Products中类ProductsController请求方法和参数保持一致。
创建UserController实现对Module名为Products请求方法调用,具体代码如下:
@RestController
public class UserController {
@Resource
private ProductClient productClient;
@GetMapping("/invoke")
public String invokeProduct(){
String result = productClient.products(21);
return "调用用户服务成功.....调用商品服务结果:{}"+result;
}
}
主函数增加EnableDiscoveryClient和EnableFeignClients注解。
启动项目
Products和Users,先启动Products,再启动Users
为了观察效果,我们这边启动两个Products,如何实现启动两个 Products,如下
点击编辑配置,显示下图
保存启动。观察nacos服务列表如下
Products有两个实例数,点击查看USERS订阅者,如下
这里的服务名称unknown,按理说应该是USERS调用了Products的服务,相当USERS订阅了Products服务。 查看了相关资料,没找到原因,根据查源码得出结论,说请求头携带服务相关信息导致,好像是源码留下一个坑,具体怎么处理,有解决办的大佬可以评论留言。不过不影响我们调用。
访问 查看调用情况
http://localhost:8989/invoke
到此调用完成。
这里记录有一个服务发现坑,方便下次排查问题,我们查询服务。访问404,
http://127.0.0.1:8989/actuator/nacos-discovery
按照网上方法多次尝试,都不行,后来发现,是地址错误,正确地址如下
http://127.0.0.1:8989/actuator/nacosdiscovery