快速入门
安装 Nacos
下载地址:https://github.com/alibaba/nacos/releases
本文版本:1.2.1
下载完成之后,解压,在 bin 目录下有启动程序。
- window:startup.cmd
- linux:startup.sh
启动之后,访问 http://localhost:8848/nacos/
,进入 Nacos 的登录界面,默认用户名密码为:nacos,登录之后进入管理界面
构建应用接入 Nacos
构建一个服务提供者以及一个服务消费者来验证服务的注册与发现
构建服务提供者
需要有 SpringBoot 基础
第一步:创建一个新的 SpringBoot 应用,命名为 nacos-provider
第二步:添加依赖
添加父依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
<relativePath/>
</parent>
添加依赖管理器
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>0.2.2.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>
<!-- Nacos服务注册与发现模块 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
第三步:创建启动类并提供一个应用接口
@EnableDiscoveryClient
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Slf4j
@RestController
static class TestController {
@GetMapping("/hello")
public String hello(@RequestParam String name) {
log.info("execute hello method with name : " + name);
return "hello " + name;
}
}
}
@SpringBootApplication
用于定义 SpringBoot 应用的启动类@EnableDiscoveryClient
Spring Cloud 提供的注解,用于开启 Spring Cloud 的服务注册与发现,
由于这里引入了spring-cloud-starter-alibaba-nacos-discovery
,所以服务注册与发现会使用 Nacos 的实现。
这与Eureka
或者Consul
的操作是一样的。
第四步:配置服务名称及 Nacos 地址
server:
port: 8080
spring:
application:
name: nacos-provider
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
第五步:启动应用
如果打印如下日志,表示注册成功
nacos registry, nacos-provider 10.32.52.236:8080 register finished
修改端口号,同一个应用启动多个实例,实现集群
访问 Nacos 管理界面,通过 服务管理 \> 服务列表
界面查看已注册的服务
点击详情,可以查看集群中每个服务实例的具体信息
构建服务消费者
第一步:创建一个新的 SpringBoot 应用,命名为 nacos-consumer
第二步:添加依赖,与上面的构建服务提供者的内容一样
第三步:创建启动类并提供一个应用接口,在该接口实现对服务提供者提供的接口进行调用
@EnableDiscoveryClient
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Slf4j
@RestController
static class TestController {
@Autowired
LoadBalancerClient loadBalancerClient;
@GetMapping("/test")
public String test() {
ServiceInstance serviceInstance = loadBalancerClient.choose("nacos-provider");
String url = serviceInstance.getUri() + "/hello?name=" + "nacos";
RestTemplate restTemplate = new RestTemplate();
String result = restTemplate.getForObject(url, String.class);
return "Invoke : " + url + ", return : " + result;
}
}
}
这里使用了 Spring Cloud Common
中的 LoadBalancerClient
接口来挑选服务实例信息,使用负载均衡的算法,
然后获取被选中实例的URI,拼接上服务提供者接口的请求地址及参数,使用 RestTemplate
进行调用。
第四步:配置服务名称及 Nacos 地址
跟上面的配置服务提供者基本一致,只是服务名及端口根据需要进行修改
server:
port: 8082
spring:
application:
name: nacos-consumer
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
第五步:启动服务
访问地址 http://localhost:8082/test
,查看日志输出
Invoke : http://10.32.52.236:8080/hello?name=nacos, return : hello nacos
Invoke : http://10.32.52.236:8081/hello?name=nacos, return : hello nacos
Invoke : http://10.32.52.236:8080/hello?name=nacos, return : hello nacos
Invoke : http://10.32.52.236:8081/hello?name=nacos, return : hello nacos
可以看到,多次请求会被依次分配给 nacos-provider
服务集群中的两个实例,可以分别查看两个实例的日志输出进行验证
其它服务间通信方式
使用RestTemplate
第一步:注册
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
@LoadBalanced 注解标记负载均衡
第二步:使用
@RestController
static class TestController {
@Autowired
RestTemplate restTemplate;
@GetMapping("/test")
public String test() {
String result = restTemplate.getForObject("http://nacos-provider/hello?name=nacos", String.class);
return "Return : " + result;
}
}
请求地址中,直接使用服务名代替 Host 部分,在真正调用时,SpringCloud 会将请求拦截,然后通过负载均衡器选出节点,并替换为具体节点的IP与端口执行调用。
使用WebClient
第一步:注册
@Bean
@LoadBalanced
public WebClient.Builder loadBalancedWebClientBuilder() {
return WebClient.builder();
}
@LoadBalanced 注解标记负载均衡,其原理与之前的RestTemplate时一样的。
第二步:使用
@Slf4j
@RestController
static class TestController {
@Autowired
private WebClient.Builder webClientBuilder;
@GetMapping("/test")
public Mono<String> test() {
Mono<String> result = webClientBuilder.build()
.get()
.uri("http://nacos-provider/hello?name=nacos")
.retrieve()
.bodyToMono(String.class);
return result;
}
}
使用Feign
第一步:消费者服务添加对 feign
的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
第二步:修改服务启动类,开启 Feign 客户端功能,并定义客户端
@EnableDiscoveryClient
@SpringBootApplication
@EnableFeignClients
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@FeignClient("nacos-provider")
public static interface Client {
@GetMapping("/hello")
String hello(@RequestParam String name);
}
}
@EnableFeignClients
注解用于开启扫描 Feign 客户端的功能@FeignClient
注解用于定义 Feign 客户端,需要指定这个接口所要调用的服务名称,
接口中定义的方法使用 Spring MVC 的注解就可以来绑定服务提供方的 REST 接口。
注意:如果是 get 请求方式,@RequestParam 必须要带,否则 get 请求会被转换成 post 请求导致请求失效
第三步:通过 Spring 容器注入接口对象,直接调用
@RestController
public class FeignConsumerController {
@Autowired
private Application.Client client;
@GetMapping("/testWithFeign")
public String test() {
String result = client.hello("haha");
return "result : " + result;
}
}
优点:强类型检查