当前位置: 首页 > article >正文

[Java]微服务治理

注册中心原理

注册中心可以统一管理项目中的所有服务

  1. 服务治理中的三个角色分别是什么?
  • 服务提供者: 暴露服务接口,供其它服务调用服务
  • 消费者: 调用其它服务提供的接口
  • 注册中心: 记录并监控微服务各实例状态,推送服务变更信息
  1. 消费者如何知道提供者的地址?
  • 服务提供者会在启动时注册自己信息到注册中心,消费者可以从注册中心订阅和拉取服务信息
  1. 消费者如何得知服务状态变更?
  • 服务提供者通过心跳机制向注册中心报告自己的健康状态,当心跳异常时注册中心会将异常服务剔除,并通知订阅了该服务的消费者
  1. 当提供者有多个实例时,消费者该选择哪一个?
  • 消费者可以通过负载均衡算法,从多个实例中选择一个

Nacos注册中心

Nacos是目前企业中占比最多的注册中心组件。它是阿里巴巴的产品,目前已经加入SpringcloudAlibaba中。

  • 官网: Nacos 快速开始

我们基于Docker来部署Nacos的注册中心,首先要准备MySQL数据库表,用来存储Nacos的数据。

  1. 执行资料中的nacos.sql文件, 创建数据库环境

  1. 资料中提供了nacos的配置文件, 主要配置了nacos与mysql的连接信息
PREFER_HOST_MODE=hostname
MODE=standalone
SPRING_DATASOURCE_PLATFORM=mysql //数据库类型
// MYSQL_SERVICE_HOST=192.168.1.97  //MySql服务地址, 改为自己的虚拟机IP地址
MYSQL_SERVICE_HOST=mysql            //mysql使用了自定义网络, 所以要通过网络名连接
MYSQL_SERVICE_DB_NAME=nacos      //数据表名称
MYSQL_SERVICE_PORT=3306          //数据库端口
MYSQL_SERVICE_USER=root          //数据库用户名
MYSQL_SERVICE_PASSWORD=123       //数据库登录密码
MYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
  1. 资料中提供了nacos镜像文件, 和配置文件一起上传至root目录下

  1. 加载本地镜像

  1. 启动nacos服务
docker run -d \
--name nacos \
--env-file ./nacos/custom.env \
-p 8848:8848 \
-p 9848:9848 \
-p 9849:9849 \
--restart=always \
--network hm-net \
nacos/nacos-server:v2.1.0-slim
  • --restart=always 设置开机自启

  1. 查看nacos日志

  1. 访问nacos服务 http://192.168.1.97:8848/nacos/#/login

默认账密: nacos/nacos

服务注册

引入nacos discovery依赖

<!--nacos 服务注册发现-->
<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

配置Nacos地址

spring:
  application:
    name: item-service #服务名称
  cloud:
    nacos :
      server-addr:192.168.150.101:8848 #nacos地址

模拟多实例部署

服务发现

消费者需要连接nacos以拉取和订阅服务,因此服务发现的前两步与服务注册一样,后面再加上服务调用

  1. 引入nacos discovery依赖
<!--nacos 服务注册发现-->
<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
  1. 配置nacos地址
spring:
  application:
    name: cart-service #服务名称
  cloud:
    nacos :
      server-addr: 192.168.1.97:8848 #nacos地址
  1. 服务发现
@Service
@RequiredArgsConstructor
public class CartServiceImpl extends ServiceImpl<CartMapper, Cart> implements ICartService {

    // 使用discoveryClient客户端进行服务拉取
    private final DiscoveryClient discoveryClient;
    ... ...

    private void handleCartItems(List<CartVO> vos) {

        // 1.获取商品id
        Set<Long> itemIds = vos.stream().map(CartVO::getItemId).collect(Collectors.toSet());
        // 2.查询商品
        // 2.1 根据服务名称获取服务的实例列表
        List<ServiceInstance> instances = discoveryClient.getInstances("item-service");
        if(CollUtil.isEmpty(instances)) {
            return;
        }
        // 2.2 手写负载均衡,从实例列表中随机挑选一个实例
        ServiceInstance instance = instances.get(RandomUtil.randomInt(instances.size()));
        //2.3 使用restTemplate远程调用商品服务
        ResponseEntity<List<ItemDTO>> response = restTemplate.exchange(
                instance.getUri() + "/items?ids={ids}",
                HttpMethod.GET,
                null,
                new ParameterizedTypeReference<List<ItemDTO>>() {
                },
                Map.of("ids", CollUtil.join(itemIds, ","))
        );

      ... ...
        
    }

}
  1. 购物车模块调用商品模块, 2个商品服务实例被随机访问


http://www.kler.cn/a/392712.html

相关文章:

  • Vue3 Suspense:处理异步渲染过程
  • 菜鸟带新鸟——基于EPlan2022的部件库制作(3D)
  • KNN分类算法 HNUST【数据分析技术】(2025)
  • 学习笔记(prism--视频【WPF-prism核心教程】)--待更新
  • MySQL45讲 第三十六讲 为什么临时表可以重名?——阅读总结
  • c++ 类似与c# 线程 AutoResetEvent 和 ManualResetEvent的实现
  • 小面馆叫号取餐流程 佳易王面馆米线店点餐叫号管理系统操作教程
  • Unity网络通信(part8.客户端主动断连与心跳消息)
  • Docker:助力应用程序开发的利器
  • 面试编程题目(一)细菌总数计算
  • Mybatis-plus 使用分页插件
  • 重生之从零设计 MySQL 架构
  • cuda的3DArray和TextureObject
  • PHP搭建开发环境(Windows系统)
  • 代码随想录算法训练营第二十九天| 134. 加油站 、135. 分发糖果 、860.柠檬水找零、406.根据身高重建队列。c++转java
  • 本地权限提升漏洞分析
  • Bootstrap 5 轮播
  • Proteus中数码管动态扫描显示不全(已解决)
  • 微积分复习笔记 Calculus Volume 1 - 5.3 The Fundamental Theorem of Calculus
  • 【ChatGPT】通过Prompt技巧优化ChatGPT的营销文案输出
  • 【优选算法篇】化繁为简,见素抱朴:从乱象中重构秩序的艺术
  • 用于在 .NET 中构建 Web API 的 FastEndpoints 入门
  • python私有化get和set的使用
  • 【实用教程】使用思维导图增强 JavaScript甘特图项目工作流程的可见性
  • 如何制作代购系统的用户管理模块
  • 免费白嫖:数据分析常用软件安装视频