Nacos实现服务提供方和服务消费方之间的通信
上篇讲到
- 在实际的项目开发中 IP+端口不可能写死
- 服务可能部署在云服务器,服务实例的网络地址是动态分配的
所以我们采用Nacos可以解决这样的问题
大致流程的理解:每个微服务在启动的时候都会向服务发现中心上报自己的网络位置(IP+端口) 这样 会在服务注册中心形成一个服务注册表,服务注册表是服务发现的核心部分,是包含所有服务实例的网络地址的数据库 服务发现客户端会定期从服务发现中心同步服务注册表,并缓存在客户端 当需要对某服务进行请求时候,服务实例通过该注册表,定位目标服务网络地址,若目标服务存在多个网络地址,则使用负载均衡算法从多个实例中选择出一个 发送请求。
1.1Nacos的安装
nacos的安装大家可以从官网下载 (本人用nacos-server-1.1.3版本)
安装启动成功后,启动如下图:
可通过浏览器访问 http://127.0.0.1:8848/nacos ,打开如下nacos控制台登录页面:
使用默认用户名:nacos,默认密码:nacos 登录即可打开主页面。
至此 Nacos已经安装完成!
接下来要做的就是实现Nacos之间服务的调用
- 首先,搭建环境(上篇已有搭建好的工程)
- 在nacos-discovery父工程中添加依赖管理
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.3.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
分别在服务提供及服务消费工程中添加依赖,此依赖的作用是服务发现
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--服务发现的客户端,1、将自己的地址注册到服务发现中心,2、从服务发现中心获取服务列表-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
服务注册
在服务提供工程中配置nacos服务发现相关的配置:
服务提供:
spring:
application:
name: nacos‐restful‐provider
cloud:
nacos:
discovery:
server‐addr: 127.0.0.1:8848
启动nacos
启动服务提供
观察nacos服务列表,nacos-restful-provider注册成功
服务发现
在服务消费工程中配置nacos服务发现相关的配置:
服务消费:
spring:
application:
name: nacos‐restful‐consumer
cloud:
nacos:
discovery:
server‐addr: 127.0.0.1:8848
修改Controller中远程调用的代码:
@RestController
@ResponseBody
public class RestConsumerController {
@Autowired
private HttpServletResponse response;
//远程调用的IP +端口
@Value("${provider.address}")
private String providerAddress;
// private String inputDate;
@Autowired
private LoadBalancerClient loadBalancerClient;
@GetMapping(value = "/service")
private String service(){
RestTemplate restTemplate =new RestTemplate();
String result = restTemplate.getForObject("http://" + providerAddress + "/service", String.class);
return "consumer invoke" + result;
}
@GetMapping(value = "/service1")
public String service1(){
//远程调用
RestTemplate restTemplate =new RestTemplate();
服务id即注册中心的中的服务名
String serverId ="nacos-restful-provider";
//获取服务的实例
ServiceInstance serviceInstance = loadBalancerClient.choose(serverId);
//获取带Http的uri
URI uri = serviceInstance.getUri();
//远程调用
String result = restTemplate.getForObject(uri + "/service", String.class);
return "consumer invoke1" + result;
}
}
执行流程:
1、服务提供方将自己注册到服务注册中心
2、服务消费方从注册中心获取服务地址
3、进行远程调用
调用成功如下:
至此 Nacos的安装、服务提供方和消费方的调用就成功了!