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

Java研学-SpringCloud(三)

一 Nacos 基础

1 介绍

  Nacos 是阿里巴巴开源的微服务核心组件,集成服务发现、动态配置管理与元数据存储,支持实时监控、热更新及多框架兼容,助力高效构建高可用云原生架构。

2 下载安装

官网下载所需要的版本,此处选用 2.5.0版本
在这里插入图片描述

3 通过cmd启动

在这里插入图片描述

# 以单机模式启动
startup.cmd -m standalone

4 访问8848端口

http://localhost:8848/nacos

在这里插入图片描述

二 Nacos 注册中心

1 添加Web依赖 – service-order

  在微服务架构中,每个微服务(如订单服务)本质是独立的 Spring Boot 应用,spring-cloud-starter 已隐式依赖 Spring Boot 核心模块(如 spring-boot-starter)。若需开发 Web 功能(REST API/前端页面),按需添加 spring-boot-starter-web 即可。

  此处还应该添加服务发现依赖(将该服务注册到注册中心)spring-cloud-starter-alibaba-nacos-discovery,但该依赖已经在父工程中进行公共导入,无需再次导入

    <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies>

2 编辑主启动类 – OrderMainApplication

@SpringBootApplication
public class OrderMainApplication {public static void main(String[] args) {SpringApplication.run(OrderMainApplication.class, args);}
}

3 编辑配置文件 – application.properties

# 定义当前微服务的名称为service-order(订单服务)
spring.application.name=service-order# 指定当前服务启动时占用的端口号为 8000
server.port=8000# 服务启动时会自动向该地址的 Nacos 服务器注册自己的信息(服务名、IP、端口等)
# 同时服务会从 Nacos 获取其他微服务的注册信息,实现服务间的相互发现
spring.cloud.nacos.server-addr=127.0.0.1:8848

4 产品微服务同上 – service-product

  ① 依赖

    <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies>

  ② 编辑主启动类 – ProductMainApplication

@SpringBootApplication
public class ProductMainApplication {public static void main(String[] args) {SpringApplication.run(ProductMainApplication.class, args);}
}

  ③ 编辑配置文件 – application.properties

spring.application.name=service-productserver.port=9000spring.cloud.nacos.server-addr=127.0.0.1:8848

5 启动查看详情

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6 多副本启动

  本机通过启动不同端口模拟集群
在这里插入图片描述
  修改配置实参 – 端口号
在这里插入图片描述
  实例数增加,每个运行中的服务进程就是一个「实例」(如同一台服务器启动 2 个service-order进程,或 3 台服务器各启动 1 个,总实例数为 3)。
在这里插入图片描述
在这里插入图片描述

三 Nacos 服务发现 – EnableDiscoveryClient

1 开启服务发现功能 – OrderMainApplication

  每一个微服务都需要添加@EnableDiscoveryClient注解,便于互相调用

// 开启服务发现功能注解
@EnableDiscoveryClient
@SpringBootApplication
public class OrderMainApplication {public static void main(String[] args) {SpringApplication.run(OrderMainApplication.class, args);}
}

2 导入单元测试依赖 – service-order

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>

3 测试类 – DiscoveryTest

@SpringBootTest
public class DiscoveryTest {// 自动注入 Spring Cloud 的服务发现客户端(通用接口),可以用于 Eureka、Consul、Nacos 等多种服务发现组件@AutowiredDiscoveryClient discoveryClient;// 自动注入 Nacos 专属的服务发现客户端,提供 Nacos 特有的功能(如更丰富的元数据操作)@AutowiredNacosServiceDiscovery nacosServiceDiscovery;// 测试 Spring Cloud 通用 DiscoveryClient 的服务发现功能,适用于所有兼容 Spring Cloud 的服务发现组件@Testvoid discoveryClientTest() {// 1. 获取所有已注册的服务名称列表// 注意:某些实现可能返回空列表如果注册中心中没有服务for (String service : discoveryClient.getServices()) {System.out.println("service = " + service);// 2. 获取指定服务的所有实例信息// 每个实例包含 host、port、uri 等信息List<ServiceInstance> instances = discoveryClient.getInstances(service);for (ServiceInstance instance : instances) {// 3. 打印实例关键信息System.out.println("ip: " + instance.getHost() + "; " + "port = " + instance.getPort());}}}/*** 测试 Nacos 专属服务发现功能* 需要确保:* 1. 项目引入了 spring-cloud-starter-alibaba-nacos-discovery* 2. Nacos 服务器正常运行,有服务注册到 Nacos* @throws NacosException 当与 Nacos 服务器交互失败时抛出*/@Testvoid nacosServiceDiscoveryTest() throws NacosException {// 1. 获取所有注册的服务名称// Nacos 特有:可能包含 Spring Cloud 通用接口无法获取的额外服务List<String> services = nacosServiceDiscovery.getServices();for (String service : services) {System.out.println("service = " + service);// 2. 获取服务的所有实例// 注意:这里获取的是原始 Nacos 实例,可能比 Spring Cloud 抽象更丰富List<ServiceInstance> instances = nacosServiceDiscovery.getInstances(service);for (ServiceInstance instance : instances) {// 3. 打印实例信息System.out.println("ip: " + instance.getHost() + "; port = " + instance.getPort());}}}
}
// 运行结果 discoveryClientTest
service = service-order
ip: 192.168.44.1; port = 8001
ip: 192.168.44.1; port = 8000
service = service-product
ip: 192.168.44.1; port = 9000
// nacosServiceDiscoveryTest
service = service-order
ip: 192.168.44.1; port = 8001
ip: 192.168.44.1; port = 8000
service = service-product
ip: 192.168.44.1; port = 9000

四 调用准备

在这里插入图片描述

1 基本流程

1. 订单服务向注册中心询问商品服务地址列表
2. 注册中心返回商品服务地址列表
3. 订单服务根据列表选择地址发送请求
4. 商品服务根据请求返回数据

2 业务流程

  用户下单(对订单服务发起请求),订单服务生成订单需获取订单中所有商品信息,远程调用商品服务获取商品数据,商品服务返回数据,生成订单交给用户。其中1张订单对应多件商品,是一对多的关系。

3 聚合模块导入lombok依赖 – services

        <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><scope>annotationProcessor</scope></dependency>

4 商品实体类 – Product

@Data
public class Product {private Long id;private BigDecimal price;private String productName;private int num;// 购买数量
}

5 商品Controller – ProductController

@RestController
public class ProductController {@AutowiredProductService productService;// 根据ID获取商品数据@GetMapping("/product/{id}")public Product getProduct(@PathVariable("id") Long productId) {Product product=productService.getProductById(productId);return  product;}
}

6 商品Service-- ProductController

  接口 – ProductService

public interface ProductService {Product getProductById(Long productId);
}

  实现类 – ProductServiceImpl

@Service
public class ProductServiceImpl implements ProductService {@Overridepublic Product getProductById(Long productId) {// 假数据Product product = new Product();product.setId(productId);product.setPrice(new BigDecimal(648));product.setProductName("大黄"+productId);product.setNum(8);return product;}
}

7 测试商品服务

在这里插入图片描述

8 订单实体类 – Order

@Data
public class Order {private Long id;// 总金额 = 商品单价 * 数量private BigDecimal totalAmount;private Long userId;private String nickname;// 订单地址private String address;// 远程查询商品列表private List<Object> productlist;
}

9 订单Controller – OrderController

@RestController
public class OrderController {@AutowiredOrderService orderService;// 创建订单@GetMapping("/create")public Order createOrder(@RequestParam("productId") Long productId,@RequestParam("userId") Long userId) {Order order = orderService.createOrder(productId, userId);return order;}
}

10 商品Service-- OrderService

  接口 – OrderService

public interface OrderService {Order createOrder(Long productId,Long userId);
}

  实现类 – OrderServiceImpl

@Service
public class OrderServiceImpl implements OrderService {@Overridepublic Order createOrder(Long productId, Long userId) {Order order = new Order();order.setId(1L);// 总金额 = 商品单价 * 数量order.setTotalAmount(new BigDecimal("0"));order.setUserId(userId);order.setNickname("huang");order.setAddress("涠洲岛");// 远程查询商品列表order.setProductlist(null);return order;}
}

11 测试订单服务

在这里插入图片描述

http://www.dtcms.com/a/332675.html

相关文章:

  • 如何安装 Homestead ?
  • 【学习笔记】JVM内存模型
  • 告别碎片化管理!飞算JavaAI实现端到端业务全流程智能监控
  • Ubuntu DNS 综合配置与排查指南
  • IP生意的天花板更高了吗?
  • 【数据分享】2022 年黑龙江省小麦、玉米和水稻幼苗影像数据集
  • Logstash 实战指南:从入门到生产级日志处理
  • GitHub 热榜项目 - 日榜(2025-08-15)
  • 硬核实用!R+贝叶斯解决真实问题:参数估计(含可靠性分析) + 回归建模(含贝叶斯因子比较) + 生产级计算实践 赠「常见报错解决方案」秘籍!
  • ubuntu 24.04 通过部署ollama提供大模型api接口
  • 线程P5 | 单例模式[线程安全版]~懒汉 + 饿汉
  • CANDB++中的CAN_DBC快速编辑方法,使用文本编辑器(如notepad++和VScode)
  • Redis 知识点与应用场景
  • 六十六、【Linux数据库】MySQL数据导入导出 、 管理表记录 、 匹配条件
  • 日本服务器哪些服务商是可以免费试用的?
  • 拒绝“效果图”返工:我用Substance 3D Stager构建产品可视化工作流
  • 计算机视觉(opencv)实战五——图像平滑处理(均值滤波、方框滤波、高斯滤波、中值滤波)附加:视频逐帧平滑处理
  • vue2生命周期详解
  • Claude Opus 4.1深度解析:抢先GPT5发布,AI编程之王主动出击?
  • 【线上问题】1分钟学会如何定位 Java 应用 CPU 飙升问题
  • Spring中存在两个相同的Bean是否会报错?
  • Amazon Bedrock如何轻松实现复杂的生成式AI模型?
  • 纯C++实现halcon的threshold
  • 【Java EE进阶 --- SpringBoot】初识Spring(创建SpringBoot项目)
  • zynq代办事项
  • Vue 侦听器(watch 与 watchEffect)全解析2
  • 【100页PPT】数字化转型集团信息化总体解决方案(附下载方式)
  • Swift 实战:用最长递增子序列算法解“俄罗斯套娃信封”问题(LeetCode 354)
  • 日本服务器租用选哪个机房国内访问比较快?
  • 【LINUX网络】HTTP协议基本结构、搭建自己的HTTP简单服务器