• Nacos服务注册与发现


    现在我们要实现基于Nacos的服务注册与发现,那么就需要导入SpringCloudAlibaba相关的依赖,我们在父工程将依赖进行管理:

    1. <dependencyManagement>
    2. <dependencies>
    3. <dependency>
    4. <groupId>org.mybatis.spring.bootgroupId>
    5. <artifactId>mybatis-spring-boot-starterartifactId>
    6. <version>2.2.0version>
    7. dependency>
    8. <dependency>
    9. <groupId>org.springframework.cloudgroupId>
    10. <artifactId>spring-cloud-dependenciesartifactId>
    11. <version>2021.0.1version>
    12. <type>pomtype>
    13. <scope>importscope>
    14. dependency>
    15. <dependency>
    16. <groupId>com.alibaba.cloudgroupId>
    17. <artifactId>spring-cloud-alibaba-dependenciesartifactId>
    18. <version>2021.0.1.0version>
    19. <type>pomtype>
    20. <scope>importscope>
    21. dependency>
    22. dependencies>
    23. dependencyManagement>

    接着我们就可以在子项目中添加服务发现依赖了,比如我们以图书服务为例:

    1. com.alibaba.cloud
    2. spring-cloud-starter-alibaba-nacos-discovery

    和注册到Eureka一样,我们也需要在配置文件中配置Nacos注册中心的地址:

    1. server:
    2. # 之后所有的图书服务节点就81XX端口
    3. port: 8101
    4. spring:
    5. datasource:
    6. driver-class-name: com.mysql.cj.jdbc.Driver
    7. url: jdbc:mysql://cloudstudy.mysql.cn-chengdu.rds.aliyuncs.com:3306/cloudstudy
    8. username: test
    9. password: 123456
    10. # 应用名称 bookservice
    11. application:
    12. name: bookservice
    13. cloud:
    14. nacos:
    15. discovery:
    16. # 配置Nacos注册中心地址
    17. server-addr: localhost:8848

    接着启动我们的图书服务,可以在Nacos的服务列表中找到:

    按照同样的方法,我们接着将另外两个服务也注册到Nacos中:

    接着我们使用OpenFeign,实现服务发现远程调用以及负载均衡,导入依赖:

    1. <dependency>
    2. <groupId>org.springframework.cloudgroupId>
    3. <artifactId>spring-cloud-starter-openfeignartifactId>
    4. dependency>
    5. <dependency>
    6. <groupId>org.springframework.cloudgroupId>
    7. <artifactId>spring-cloud-starter-loadbalancerartifactId>
    8. dependency>

    编写接口:

    1. @FeignClient("userservice")
    2. public interface UserClient {
    3. @RequestMapping("/user/{uid}")
    4. User getUserById(@PathVariable("uid") int uid);
    5. }
    6. @FeignClient("bookservice")
    7. public interface BookClient {
    8. @RequestMapping("/book/{bid}")
    9. Book getBookById(@PathVariable("bid") int bid);
    10. }
    11. @Service
    12. public class BorrowServiceImpl implements BorrowService{
    13. @Resource
    14. BorrowMapper mapper;
    15. @Resource
    16. UserClient userClient;
    17. @Resource
    18. BookClient bookClient;
    19. @Override
    20. public UserBorrowDetail getUserBorrowDetailByUid(int uid) {
    21. List borrow = mapper.getBorrowsByUid(uid);
    22. User user = userClient.getUserById(uid);
    23. List bookList = borrow
    24. .stream()
    25. .map(b -> bookClient.getBookById(b.getBid()))
    26. .collect(Collectors.toList());
    27. return new UserBorrowDetail(user, bookList);
    28. }
    29. }
    30. @EnableFeignClients
    31. @SpringBootApplication
    32. public class BorrowApplication {
    33. public static void main(String[] args) {
    34. SpringApplication.run(BorrowApplication.class, args);
    35. }
    36. }

    接着我们进行测试:

    测试正常,可以自动发现服务,接着我们来多配置几个实例,去掉图书服务和用户服务的端口配置:

    然后我们在图书服务和用户服务中添加一句打印方便之后查看:

    1. @RequestMapping("/user/{uid}")
    2. public User findUserById(@PathVariable("uid") int uid){
    3. System.out.println("调用用户服务");
    4. return service.getUserById(uid);
    5. }

    现在将全部服务启动:

    可以看到Nacos中的实例数量已经显示为2

    接着我们调用借阅服务,看看能否负载均衡远程调用:

    OK,负载均衡远程调用没有问题,这样我们就实现了基于Nacos的服务的注册与发现,实际上大致流程与Eureka一致。

    值得注意的是,Nacos区分了临时实例和非临时实例:

    那么临时和非临时有什么区别呢?

    • 临时实例:和Eureka一样,采用心跳机制向Nacos发送请求保持在线状态,一旦心跳停止,代表实例下线,不保留实例信息。
    • 非临时实例:由Nacos主动进行联系,如果连接失败,那么不会移除实例信息,而是将健康状态设定为false,相当于会对某个实例状态持续地进行监控。

    我们可以通过配置文件进行修改临时实例:

    1. spring:
    2. application:
    3. name: borrowservice
    4. cloud:
    5. nacos:
    6. discovery:
    7. server-addr: localhost:8848
    8. # 将ephemeral修改为false,表示非临时实例
    9. ephemeral: false

    接着我们在Nacos中查看,可以发现实例已经不是临时的了:

    如果这时我们关闭此实例,那么会变成这样:

    只是将健康状态变为false,而不会删除实例的信息。

  • 相关阅读:
    发明专利和实用新型专利的区别
    前端程序员容易出错的基础知识
    vue2给对象新增、删除属性,界面不刷新 。通过数组下标修改数组界面不会刷新
    黄菊华老师,Java Servlet毕业设计毕设辅导课(5):Servlet配置虚拟路径映射
    冥想第五百九十四天
    贪心算法归纳
    【图像分割】基于matlab萤火虫算法图像分割【含Matlab源码 2136期】
    【iOS】—— 单例模式
    软考-程序员-知识点汇总
    触摸屏实验
  • 原文地址:https://blog.csdn.net/Leon_Jinhai_Sun/article/details/126064903