在Spring Cloud Alibaba基础教程-Nacos(二)当中学习了,如何使用 nacos图形化界面操作 ,使用Nacos部署集群,下面我们开始Nacos最后一篇的学习 ,如果对你有帮助,记得点个关注
前置条件
首先 你已经拥有Nacos的基础知识
搭建前环境 可以参考
本文需要实现:
通过一个简单的示例来感受一下如何将服务注册到 Nacos的区别
- alibaba-provider-server(生产者), alibaba-consumer-client(消费者) 环境搭建
- 生产者/消费者 把服务注册到nacos 注册中心
- 通过RestTemplate 模块,消费者PRC的方式 调用生产者
- 手写 负载均衡器 LoadBalancer (不建议使用)
- 使用 负载均衡器 Rabbit
创建Maven 项目 alibaba-provider-server( 版本2.0.1)
创建一个工程名为 alibaba-provider-server
的服务提供者项目,pom.xml 配置如下:
<!-- springboot 整合web组件-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- springboot 整合 alibaba-nacos-discovery 注册中心 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>0.2.2.RELEASE</version>
</dependency>
yml 文件配置
server:
port: 8081
spring:
application:
## 服务名称
name: alibaba-provider-server
cloud:
nacos:
discovery:
## 服务注册地址
server-addr: 192.168.100.22:8848
management:
endpoints:
web:
exposure:
include: "*"
启动类
通过 @EnableDiscoveryClient 注解表明是一个 Nacos 客户端,该注解是 Spring Cloud 提供的原生注解
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@EnableDiscoveryClient
public class NacosProviderApplication {
public static void main(String[] args) {
SpringApplication.run(NacosProviderApplication.class, args);
}
@RestController
public class EchoController {
@GetMapping(value = "/echo/{message}")
public String echo(@PathVariable String message) {
return "Hello Nacos Discovery " + message;
}
@GetMapping("/getUserId")
public String getUserId(String userId){
return "userId:"+userId;
}
}
启动工程
通过浏览器访问 http://192.168.100.22:8848/nacos
,即 Nacos Server 网址
你会发现一个服务已经注册在服务中了,服务名为 nacos-provider
这时打开 http://localhost:8081/echo/hi ,你会在浏览器上看到:
Hello Nacos Discovery hi
扫描二维码关注公众号,回复: 9506648 查看本文章
服务的端点检查
使用 前需要导入,省略版本号,必须是 父pom中声明了
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
spring-cloud-starter-alibaba-nacos-discovery 在实现的时候提供了一个 EndPoint, EndPoint 的访问地址为 http://ip:port/actuator/nacos-discovery。 EndPoint 的信息主要提供了两类:
1、subscribe: 显示了当前有哪些服务订阅者
2、NacosDiscoveryProperties: 显示了当前服务实例关于 Nacos 的基础配置
通过浏览器访问 http://localhost:8081/actuator/nacos-discovery
你会在浏览器上看到:
创建Maven alibaba-consumer-client
创建一个工程名为 alibaba-consumer-client
的服务提供者项目,pom.xml 配置如下:
<!-- springboot 整合web组件-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- springboot 整合 alibaba-nacos-discovery 注册中心 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>0.2.2.RELEASE</version>
</dependency>
Yml 配置
spring:
application:
name: nacos-consumer
cloud:
nacos:
discovery:
server-addr: 192.168.100.22:8848
server:
port: 9091
management:
endpoints:
web:
exposure:
include: "*"
启动类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(NacosConsumerApplication.class, args);
}
}
Configuration
创建一个名为 NacosConsumerConfiguration 的 Java 配置类,主要作用是为了注入 RestTemplate
创建一个名为 NacosConsumerConfiguration 的 Java 配置类,主要作用是为了注入 RestTemplate
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class NacosConsumerConfiguration {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
消费者Controller 调用生产者
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class NacosConsumerController {
@Autowired
private LoadBalancerClient loadBalancerClient;
/**
* rpc 调用工具
*/
@Autowired
private RestTemplate restTemplate;
@Value("${spring.application.name}")
private String appName;
/**
* 获取注册中心数据对象
*/
@Autowired
private DiscoveryClient discoveryClient;
@GetMapping(value = "/echo/app/name")
public String echo() {
//使用 LoadBalanceClient 和 RestTemplate 结合的方式来访问
ServiceInstance serviceInstance = loadBalancerClient.choose("nacos-provider");
String url = String.format("http://%s:%s/echo/%s", serviceInstance.getHost(), serviceInstance.getPort(), appName);
return restTemplate.getForObject(url, String.class);
}
}
@GetMapping("/login")
public String login(){
// 通过服务名获取到注册到nacos 的ip+端口地址信息(集群会获取多个)
List<ServiceInstance> instances = discoveryClient.getInstances("nacos-provider");
String ipAddr = instances.get(0).getUri().toString();
String url = ipAddr+"/getUserId?userId=123456789";
// rpc 调用
String result = restTemplate.getForObject(url, String.class);
System.out.println("调用anacos-provider服务,result:" + result);
return result;
}
启动工程
通过浏览器访问 http://192.168.100.22:8848/nacos,即 Nacos Server 网址
你会发现多了一个名为 nacos-consumer
的服务
这时打开 http://localhost:9091/echo/app/name ,你会在浏览器上看到:
Hello Nacos Discovery nacos-consumer
如果输入 http://127.0.0.1:9091/login,你会在浏览器上看到:
userId : 123456789
服务的端点检查
通过浏览器访问 http://localhost:9091/actuator/nacos-discovery
你会在浏览器上看到: