服务注册:所有提供者将自己提供服务的名称及自己主机详情(IP、端口、版本等)写入到另一台主机中的一个列表中,以便其他服务能够发现并调用它。这台主机称为服务注册中心,而这个表称为服务注册表。
服务发现:所有消费者需要调用微服务时,其会从注册中心首先将服务注册表下载到本地,然后根 据消费者本地设置好的负载均衡策略选择一个服务提供者进行调用的过程。
一、定义Nacos提供者(服务注册)
1.1 添加依赖
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<java.version>17</java.version>
<spring-cloud.version>2022.0.0</spring-cloud.version>
<spring-cloud-alibaba.version>2022.0.0.0-RC2</spring-cloud-alibaba.version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.0.6</version>
<relativePath/>
</parent>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
1.2 编写配置文件
server:
port: 8081 # 端口号
spring:
application:
name: nacos-provider # 微服务名称
cloud:
nacos:
discovery:
server-addr: localhost:8848 # Nacos注册中心地址
username: nacos # nacos控制台账号
password: nacos # nacos控制台密码
1.3 编写控制层
import jakarta.annotation.Resource;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RestController
@RequestMapping("/nacos/provider")
public class ProviderNacosController {
// 服务发现客户端
@Resource
private DiscoveryClient discoveryClient;
@GetMapping("/hello_p")
public String helloProvider() {
return "I am provider!";
}
@GetMapping("/discovery")
public List<String> discoveryHandle() {
// 获取注册中心所有服务名称
List<String> services = discoveryClient.getServices();
for (String serviceName : services) {
// 获取指定微服务名称的所有微服务实例
List<ServiceInstance> instances = discoveryClient.getInstances(serviceName);
for (ServiceInstance instance : instances) {
Map<String, Object> map = new HashMap<>();
map.put("serviceName", serviceName);
map.put("serviceId", instance.getServiceId());
map.put("serviceHost", instance.getHost());
map.put("servicePort", instance.getPort());
map.put("serviceUri", instance.getUri());
System.out.println(map);
}
}
return services;
}
}
1.4 启动Nacos并运行启动类
在启动了Naocs并且运行了启动类的情况下,在浏览器地址栏通过 http://localhost:8848/nacos/index.html 可打开Nacos控制台的登录页面,输入账号密码(默认都为naocs)即可进入Nacos控制台。
点击服务列表,在 public 命名空间下可以发现出现(注册)了一条名为 nacos-provider 的服务。
二、定义Nacos消费者(服务注册)
2.1 添加依赖
旧版本的 Nacos 默认使用 Ribbon 做负载均衡。新版的 Nacos 以及完全摒弃了 Ribbon,新版的 Nacos 目前默认使用 Spring Cloud 自己的 loadbalancer 做负载均衡,所以使用新版的 Nacos 时,要加入 spring-cloud-starter-loadbalance 依赖。
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<java.version>17</java.version>
<spring-cloud.version>2022.0.0</spring-cloud.version>
<spring-cloud-alibaba.version>2022.0.0.0-RC2</spring-cloud-alibaba.version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.0.6</version>
<relativePath/>
</parent>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--新版本的nacos要添加 spring-cloud-starter-loadbalance 依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2.2 编写配置文件
spring:
application:
name: nacos-consumer # 微服务名称
cloud:
nacos:
discovery:
server-addr: localhost:8848 # Nacos注册中心地址
username: nacos
password: nacos
2.3 编写控制器类
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
@RequestMapping("/nacos/consumer")
public class ConsumerNacosController {
@Resource
private RestTemplate restTemplate;
private static final String SERVICE_PROCIER = "http://nacos-provider/nacos/provider";
@GetMapping("/hello_c")
public String hello() {
String url = SERVICE_PROCIER + "/hello_p";
return restTemplate.getForObject(url, String.class);
}
}
2.5 编写配置类
当使用微服务名称来访问 provider 时,其是通过负载均衡方式进行访问的。所以需要添加如下注解。这里的负载均衡采用的是 spring cloud 自己开发的 spring cloud loadbalancer。
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class RestTemplateConfig {
@LoadBalanced // 以负载均衡方式调用
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
2.6 启动Nacos并运行启动类
此时Nacos控制台中存在 nacos-provider 和 nacos-consumer 两个服务。
三、测试(服务发现)
服务消费者(nacos-consumer)通过负载均衡策略调用服务提供者(nacos-provider),即使用消费者的请求路径发送请求,会自动调用对应提供者的业务。
通过服务提供者(nacos-provider)中的 discoveryHandle 方法,可以查看到当前注册中心所有服务名称。