• Spring Cloud alibaba 集成 nacos 以及整合 Ribbon 与 Feign 实现负载调用(3)


    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 等。

    启动服务

    我们这里就使用单节点启动,不做过多的配置,先熟悉下怎么使用,以及怎么进行程序集成。

    1. // 启动服务
    2. sh startup.sh -m standalone
    3. // 停止服务
    4. sh shutdown.sh

    访问

    用户名和密码都是:nacos

    工程集成 Nacos

    video 模块

    依赖引入

    1. <dependency>
    2. <groupId>com.alibaba.cloudgroupId>
    3. <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
    4. dependency>

    配置文件

    1. server:
    2. port: 8000
    3. spring:
    4. application:
    5. name: demo-video
    6. datasource:
    7. driver-class-name: com.mysql.cj.jdbc.Driver
    8. url: jdbc:mysql://192.168.152.129:3306/cloud_video?useUnicode=true&characterEncoding=utf-8&useSSL=false
    9. username: admin
    10. password: 123456
    11. # 增加服务发现地址
    12. cloud:
    13. nacos:
    14. discovery:
    15. server-addr: 192.168.152.129:8848
    16. # 控制台输出sql、下划线转驼峰
    17. mybatis:
    18. configuration:
    19. log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    20. map-underscore-to-camel-case: true

     启动类增加注解 @EnableDiscoveryClient

    1. @SpringBootApplication
    2. @EnableDiscoveryClient
    3. @MapperScan("com.demo.mapper")
    4. public class VideoApplication {
    5. public static void main(String[] args) {
    6. SpringApplication.run(VideoApplication.class, args);
    7. }
    8. }

    尝试启动

    控制台可以看到有对应的日志输出

     我们访问 nacos 控制台,就可以看到对应的服务已经注册上去了

    警告处理 

    控制台上面存在警告,我们这里处理下:

    WARN 6384 --- [           main] c.n.c.sources.URLConfigurationSource     : No URLs will be polled as dynamic configuration sources.

    我们只需要创建一个 config.properties 文件就可以了,里面的内容可以为空

     然后,我们再次启动,就没有警告信息了:

    启动多个 video 服务

    在测试负载调用之前,我们先多启动几个 video 服务,先修改配置文件的端口,然后在复制一个对应的启动服务:

     复制多个服务:

     然后点击确认,启动对应的服务:

     我们以同样的方式再次启动一个的服务:

     我们在nacos 后台就可以看到对应的服务集群了:

     负载均衡调用

    这里是需要整合 Ribbon 与 Feign 来实现负载调用。

    order 模块

     

    pom 文件增加依赖

    1. <dependency>
    2. <groupId>com.alibaba.cloudgroupId>
    3. <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
    4. dependency>

    application.yml 增加 nacos 的配置

    1. server:
    2. port: 9000
    3. spring:
    4. application:
    5. name: demo-order
    6. datasource:
    7. driver-class-name: com.mysql.cj.jdbc.Driver
    8. url: jdbc:mysql://192.168.152.129:3306/cloud_video?useUnicode=true&characterEncoding=utf-8&useSSL=false
    9. username: admin
    10. password: 123456
    11. ## 增加 nacos 服务发现地址
    12. cloud:
    13. nacos:
    14. discovery:
    15. server-addr: 192.168.152.129:8848
    16. # 控制台输出sql、下划线转驼峰
    17. mybatis:
    18. configuration:
    19. log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    20. map-underscore-to-camel-case: true

    启动类增加注解

    1. @EnableDiscoveryClient
    2. @SpringBootApplication
    3. public class OrderApplication {
    4. public static void main(String[] args) {
    5. SpringApplication.run(OrderApplication.class, args);
    6. }
    7. }

    RestTemplateConfig 增加配置文件

    1. @Configuration
    2. public class RestTemplateConfig {
    3. @Bean
    4. @LoadBalanced
    5. public RestTemplate getRestTemplate(){
    6. return new RestTemplate();
    7. }
    8. }

    OrderController 增加对外提供服务访问,以及负载调用的方式

    1. @RestController
    2. @RequestMapping("api/v1/video_order")
    3. public class OrderController {
    4. @Autowired
    5. private RestTemplate restTemplate;
    6. @RequestMapping("/save")
    7. public Object save(int videoId) {
    8. // 使用 负载均衡策略
    9. // 这里通过服务名去调用,这里的服务名就是在 nacos 上面的服务名称
    10. Video video = restTemplate.getForObject("http://demo-video/api/v1/video/find_by_id?videoId=" + videoId, Video.class);
    11. VideoOrder videoOrder = new VideoOrder();
    12. videoOrder.setVideoId(video.getId());
    13. videoOrder.setVideoTitle(video.getTitle());
    14. videoOrder.setCreateTime(new Date());
    15. videoOrder.setServerInfo(video.getServerInfo());
    16. return videoOrder;
    17. }
    18. }

    启动 Order 服务

     nacos 控制台

     测试

    localhost:9000/api/v1/video_order/save?videoId=30

     这个可以多访问几次,可以看到是返回的服务器地址是不一样的。

    使用 Fiegn 接口实现调用

    增加对应的服务类

     Order 模块中引入依赖

    1. <dependency>
    2. <groupId>org.springframework.cloudgroupId>
    3. <artifactId>spring-cloud-starter-openfeignartifactId>
    4. dependency>

    VideoService 增加内容

    这里就是使用 Feign 接口来实现调用吗,这里的好处是与真实的调用解耦,看过DDD 之后,明白说使用 Feign 接口来作为 “防腐层”。

    1. @FeignClient(name = "demo-video") // 这里需要填写的就是相应的服务名
    2. public interface VideoService {
    3. @GetMapping(value = "/api/v1/video/find_by_id")
    4. Video findById(@RequestParam("videoId") int videoId);
    5. // 这里使用 @RequestMapping 与 @PostMapping 注解都是可以的
    6. @RequestMapping(value = "/api/v1/video/saveByFeign")
    7. int saveByFeign(@RequestBody() Video video);
    8. }

    OrderController 中增加对应的访问接口

    1. @Autowired
    2. private VideoService videoService;
    3. @RequestMapping("/findById")
    4. public Object findById(int videoId) {
    5. Video video = videoService.findById(videoId);
    6. VideoOrder videoOrder = new VideoOrder();
    7. videoOrder.setVideoId(video.getId());
    8. videoOrder.setVideoTitle(video.getTitle());
    9. videoOrder.setCreateTime(new Date());
    10. videoOrder.setServerInfo(video.getServerInfo());
    11. return videoOrder;
    12. }

    启动类中增加注解 @EnableFeignClients

    1. @EnableDiscoveryClient
    2. @SpringBootApplication
    3. @EnableFeignClients
    4. public class OrderApplication {
    5. public static void main(String[] args) {
    6. SpringApplication.run(OrderApplication.class, args);
    7. }
    8. }

    启动服务测试访问

    http://localhost:9000/api/v1/video_order/findById?videoId=30

    最后,到这里就算集成完了。对于不同的服务模块,如果是需要通过 nacos 负载访问的是,是都需要注册到 nacos 服务端中。

  • 相关阅读:
    镜像永久挂载
    Springboot后端跨域处理
    大数据采集工具Flume
    互补格雷码+相移码求解三维点云
    C++面试八股文:什么是RAII?
    用户中心系统开发--表设计以及表说明
    (数据科学学习手札154)geopandas 0.14版本新特性一览
    WPS ppt怎么设置自动播放?wps ppt如何设置自动放映?
    【Linux】计算机的软硬件体系结构
    MHA高可用配置及故障切换
  • 原文地址:https://blog.csdn.net/qq_18948359/article/details/126176988