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 服务端中。










