目录
1、什么是Nacos
1.1、概述
欢迎来到Nacos的世界!
Nacos致力于帮助您发现、配置和管理微服务。Nacos提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos帮助您更敏捷和更容易的构建、交付和管理微服务平台。Nacos是以构建“服务”为中心的现代化应用架构(例如微服务范式,云原生范式)的服务基础设备。
参考资料:
1.2、Nacos关键特性包括:
- 服务发现和服务健康监测
- 动态配置服务,带管理界面,支持丰富的配置维度
- 动态 DNS 服务
- 服务及其元数据管理
1.3、Nacos下载安装
Nacos 依赖 Java 环境来运行。如果您是从代码开始构建并运行Nacos,还需要为此配置 Maven环境。然后从官网下载Nacos的解压包,安装稳定版的,下载地址:https://github.com/alibaba/nacos/releases
本次下载的版本是1.1.4,下载完成后进行解压。在解压的目录/bin下,windows系统点击startup.cmd就可以启动nacos,Linux或mac执行命令即可启动单机版Nacos服务。
sh startup.sh -m standalone
启动完成之后,访问:http://127.0.0.1:8848/nacos/
,默认的登陆用户名为nacos,密码也为nacos。进入Nacos的服务管理页面,成功如下:
界面可知道,此时没有服务注册到Nacos上。
参考资料:
2、使用Nacos服务注册和发现
服务注册和发现是微服务治理的根基,服务注册和发现组件是整个微服务系统的灵魂,选择合适的服务注册和发现组件至关重要,目前主流的服务注册和发现组件有Consul、Eureka、Etcd等。 随着Eureka的闭源,Spring cloud netflix-oss组件大规模的进入到了维护期,不再提供新功能,spring cloud alibaba受到开源社区的大力拥护。
2.1、项目实践
2.1.1、项目介绍
本次创建一个项目springcloud-alibaba-project,其中包含两个module:
- service-nacos-provider:服务提供者
- service-nacos-consumer:服务消费者
项目提示:完全可以创建多个项目,这里为了方便管理使用多个module模式。
2.1.2、服务提供者
在service-provider模块引入相关依赖、配置服务信息及nacos地址、在主类上添加服务发现注解、创建一个普通的接口。
1、首先创建一个maven主工程:SpringCloud-Alibaba-Project,Spring boot版本为2.1.6.RELEASE,Spring Cloud 版本为Greenwich.SR1,创建完后的工程的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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!--新建Maven项目:springcloud,切记Packageing是pom模式-->
<!--主要是定义POM文件,将后续各个子模块公用的jar包等统一提取出来,类似一个抽象父-->
<groupId>com.boyue</groupId>
<artifactId>SpringCloud-Alibaba-Project</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>service-nacos-provider</module>
<module>service-nacos-consumer</module>
</modules>
<!--springcloud项目依赖于springboot,-->
<!--springboot项目三要素之一,parent依赖-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
</parent>
<dependencyManagement>
<dependencies>
<!--SpringCloud依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--Springboot依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.6.RELEASE</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<!--springboot三要素之一:spring-boot-maven-plugin插件-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2、在主工程下创建一个module:service-nacos-provider。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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>SpringCloud-Alibaba-Project</artifactId>
<groupId>com.boyue</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>service-nacos-provider</artifactId>
<dependencies>
<!--springboot web依赖-->
<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>
<version>0.2.1.RELEASE</version>
</dependency>
<!--slf4j日志 依赖-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
</dependencies>
</project>
3、在工程的配置文件application.yml做相关的配置,配置如下:
server:
port: 9100
# 服务的name
spring:
application:
name: SERVICE-NACOS-PROVIDER
cloud:
nacos:
discovery:
# 配置nacos的地址
server-addr: localhost:8848
4、在springboot工程的启动类上添加注解@EnableDiscoveryClient:
@SpringBootApplication
@EnableDiscoveryClient
public class ServiceNacosProvider {
/**
* 1、@SpringBootApplication注解开启 Springboot应用
* 2、@EnableDiscoveryClient注解开启 服务的注册与发现
* @param args
*/
public static void main(String[] args) {
SpringApplication.run(ServiceNacosProvider.class,args);
}
}
5、编写服务提供的一个普通接口:
@RestController
@RequestMapping("/service-provider")
public class ServiceInfoController {
private static Logger logger=LoggerFactory.getLogger(ServiceInfoController.class);
@Value("${server.port}")
private String serverPort;
@GetMapping("/ServerInfo")
public RespBean serverInfo(){
logger.info("hello,该服务信息端口为:"+serverPort);
return RespBean.ok("hello,该服务信息端口为:"+serverPort);
}
}
2.1.3、服务消费者
在service-nacos-consumer引入相关依赖、配置服务信息及nacos地址、在主类上添加服务发现注解、调用服务提供者接口:(大体跟提供者一样)
1、在主工程下创建一个module:service-nacos-consumer。使用RestTemplate消费服务和FeignClient调用服务,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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>SpringCloud-Alibaba-Project</artifactId>
<groupId>com.boyue</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>service-nacos-consumer</artifactId>
<dependencies>
<!--Springboot web依赖-->
<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>
<version>0.2.1.RELEASE</version>
</dependency>
<!--ribbon 依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
<!--feign 依赖,feign自动集成了ribbon,hystrix-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
</project>
2、在工程的配置文件application.yml做相关的配置,配置如下:
server:
port: 9101
#服务的name,服务之间调用使用
spring:
application:
name: SERVICE-NACOS-CONSUMER
cloud:
nacos:
discovery:
# 配置nacos server的地址信息
server-addr: localhost:8848
3、添加服务发现注解,在主类添加@EnableDiscoveryClient,并添加RestTemplate bean,用于请求调用。
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ServiceNacosConsumer {
/**
* 1、@SpringBootApplication注解开启 Springboot应用
* 2、@EnableDiscoveryClient注解开启 服务的注册与发现
* 3、@EnableFeignClients 开启feign组件
* @param args
*/
public static void main(String[] args) {
SpringApplication.run(ServiceNacosConsumer.class,args);
}
/**
* restTemplate+Ribbon方式调用,开启负载均衡
* @return
*/
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
4、在这里使用2种方式消费服务,一种是RestTemplate,一种是Feign。
使用Ribbon+RestTemplate来消费服务,在测试类RibbonTestService中通过注入RestTemplate来消费服务SERVICE-NACOS-PROVIDER的接口。
@Service
public class RibbonTestServiceImpl implements RibbonTestService {
@Autowired
private RestTemplate restTemplate;
@Override
public RespBean getInfo() {
// 通过之前注入ioc容器的restTemplate来消费eureka-client服务的“/info”接口,
// 在这里我们直接用的程序名替代了具体的url地址,
// 在ribbon中它会根据服务名来选择具体的服务实例,
// 根据服务实例在请求的时候会用具体的url替换掉服务名
return restTemplate.getForObject("http://SERVICE-NACOS-PROVIDER/service-provider/ServerInfo",RespBean.class);
}
}
Ribbon消费服务的Controller具体接口:
@RestController
@RequestMapping("/RibbonTest")
public class RestTempleController {
@Autowired
private RibbonTestService ribbonTestService;
@GetMapping("/getInfo")
public RespBean getInfo(){
return ribbonTestService.getInfo();
}
}
FeignClient调用服务,定义一个feign接口,通过@ FeignClient(“服务名”),来指定调用哪个服务:
@FeignClient(value = "SERVICE-NACOS-PROVIDER")
public interface FeignTestService {
@GetMapping("/service-provider/ServerInfo")
RespBean getInfoTwo();
// 一、Feign是一个声明式的伪Http客户端,它使得写Http客户端变得更简单。
// 使用Feign,只需要创建一个接口并注解。
// 二、定义一个feign接口,通过@ FeignClient(“服务名”),来指定调用哪个服务
/*1、Feign 采用的是基于接口的注解
2、Feign 整合了ribbon,具有负载均衡的能力
3、整合了Hystrix,具有熔断的能力*/
}
Feign调用服务的Controller具体接口:
@RestController
@RequestMapping("/FeignTest")
public class FeignTestController {
@Autowired(required = false)
private FeignTestService feignTestService;
@GetMapping("/getInfoTwo")
public RespBean getInfoTwo(){
return feignTestService.getInfoTwo();
}
}
2.2、启动并验证
2.2.1、查看服务列表
分别启动服务提供者(此服务多端口启动)、服务消费者,打开nacos页面查看服务列表。
点击详情,我们还能看到每个服务具体的实例信息,如下图所示:
2.2.2、访问消费接口
浏览器输入地址:http://localhost:9101/RibbonTest/getInfo 和 http://localhost:9101/FeignTest/getInfoTwo 可以看到接口的返回信息。
扫码关注微信公众号: