先贴上官网地址
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
依赖引入
- <dependency>
- <groupId>com.alibaba.cloudgroupId>
- <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
- 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 服务,先修改配置文件的端口,然后在复制一个对应的启动服务:
复制多个服务:
然后点击确认,启动对应的服务:
我们以同样的方式再次启动一个的服务:
我们在nacos 后台就可以看到对应的服务集群了:
这里是需要整合 Ribbon 与 Feign 来实现负载调用。
pom 文件增加依赖
- <dependency>
- <groupId>com.alibaba.cloudgroupId>
- <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
- 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
这个可以多访问几次,可以看到是返回的服务器地址是不一样的。
增加对应的服务类
Order 模块中引入依赖
- <dependency>
- <groupId>org.springframework.cloudgroupId>
- <artifactId>spring-cloud-starter-openfeignartifactId>
- dependency>
VideoService 增加内容
这里就是使用 Feign 接口来实现调用吗,这里的好处是与真实的调用解耦,看过DDD 之后,明白说使用 Feign 接口来作为 “防腐层”。
- @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 服务端中。