Nacos 简介
先贴上官网地址
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
这里,我们先使用 nacos 作为服务的注册中心来使用,先测试负载调用,暂时不作为 配置中心。后面我们一点点的来做集成。
Nacos 服务启动
我这边使用的版本是:nacos-server-1.3.2,大家可以根据自己的需要去下载不同的版本。
运行的服务器是自己搭建的虚拟机:centos7
nacos 项目是一个基于 spring 做的项目,我们进入conf 文件目录中去,可以看到:
上面有配置文件 application.properties,以及集群的文件 cluster.conf.example,mysql 的建表语句等 nacos-mysql.sql 等。
启动服务

我们这里就使用单节点启动,不做过多的配置,先熟悉下怎么使用,以及怎么进行程序集成。
// 启动服务
sh startup.sh -m standalone
// 停止服务
sh shutdown.sh
访问
用户名和密码都是:nacos
工程集成 Nacos
video 模块
依赖引入
<!--添加nacos客户端-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
配置文件
server:
port: 8000
spring:
application:
name: demo-video
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.152.129:3306/cloud_video?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: admin
password: 123456
# 增加服务发现地址
cloud:
nacos:
discovery:
server-addr: 192.168.152.129:8848
# 控制台输出sql、下划线转驼峰
mybatis:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
map-underscore-to-camel-case: true
启动类增加注解 @EnableDiscoveryClient
@SpringBootApplication
@EnableDiscoveryClient
@MapperScan("com.demo.mapper")
public class VideoApplication {
public static void main(String[] args) {
SpringApplication.run(VideoApplication.class, args);
}
}
尝试启动
控制台可以看到有对应的日志输出
我们访问 nacos 控制台,就可以看到对应的服务已经注册上去了
警告处理
控制台上面存在警告,我们这里处理下:
WARN 6384 --- [ main] c.n.c.sources.URLConfigurationSource : No URLs will be polled as dynamic configuration sources.
我们只需要创建一个 config.properties 文件就可以了,里面的内容可以为空
然后,我们再次启动,就没有警告信息了:
启动多个 video 服务
在测试负载调用之前,我们先多启动几个 video 服务,先修改配置文件的端口,然后在复制一个对应的启动服务:
复制多个服务:
然后点击确认,启动对应的服务:
我们以同样的方式再次启动一个的服务:
我们在nacos 后台就可以看到对应的服务集群了:
负载均衡调用
order 模块
pom 文件增加依赖
<!--添加nacos客户端-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
application.yml 增加 nacos 的配置
server:
port: 9000
spring:
application:
name: demo-order
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.152.129:3306/cloud_video?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: admin
password: 123456
## 增加 nacos 服务发现地址
cloud:
nacos:
discovery:
server-addr: 192.168.152.129:8848
# 控制台输出sql、下划线转驼峰
mybatis:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
map-underscore-to-camel-case: true
启动类增加注解
@EnableDiscoveryClient
@SpringBootApplication
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
}
RestTemplateConfig 增加配置文件
@Configuration
public class RestTemplateConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
OrderController 增加对外提供服务访问,以及负载调用的方式
@RestController
@RequestMapping("api/v1/video_order")
public class OrderController {
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/save")
public Object save(int videoId) {
// 使用 负载均衡策略
// 这里通过服务名去调用,这里的服务名就是在 nacos 上面的服务名称
Video video = restTemplate.getForObject("http://demo-video/api/v1/video/find_by_id?videoId=" + videoId, Video.class);
VideoOrder videoOrder = new VideoOrder();
videoOrder.setVideoId(video.getId());
videoOrder.setVideoTitle(video.getTitle());
videoOrder.setCreateTime(new Date());
videoOrder.setServerInfo(video.getServerInfo());
return videoOrder;
}
}
启动 Order 服务
nacos 控制台
测试
localhost:9000/api/v1/video_order/save?videoId=30
这个可以多访问几次,可以看到是返回的服务器地址是不一样的。
使用 Fiegn 接口实现调用
增加对应的服务类
Order 模块中引入依赖
<!-- 增加 openFeign依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
VideoService 增加内容
@FeignClient(name = "demo-video") // 这里需要填写的就是相应的服务名
public interface VideoService {
@GetMapping(value = "/api/v1/video/find_by_id")
Video findById(@RequestParam("videoId") int videoId);
// 这里使用 @RequestMapping 与 @PostMapping 注解都是可以的
@RequestMapping(value = "/api/v1/video/saveByFeign")
int saveByFeign(@RequestBody() Video video);
}
OrderController 中增加对应的访问接口
@Autowired
private VideoService videoService;
@RequestMapping("/findById")
public Object findById(int videoId) {
Video video = videoService.findById(videoId);
VideoOrder videoOrder = new VideoOrder();
videoOrder.setVideoId(video.getId());
videoOrder.setVideoTitle(video.getTitle());
videoOrder.setCreateTime(new Date());
videoOrder.setServerInfo(video.getServerInfo());
return videoOrder;
}
启动类中增加注解 @EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
@EnableFeignClients
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
}
启动服务测试访问
http://localhost:9000/api/v1/video_order/findById?videoId=30
最后,到这里就算集成完了。对于不同的服务模块,如果是需要通过 nacos 负载访问的是,是都需要注册到 nacos 服务端中。