十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Spring Cloud 微服务实战(一):还在硬编码服务地址?Nacos 注册中心从零搭建

Spring Cloud 微服务实战(一):还在硬编码服务地址?Nacos 注册中心从零搭建 Spring Cloud 微服务实战一还在硬编码服务地址Nacos 注册中心从零搭建个人主页夏天拐跑了西瓜专栏传送门《大模型应用开发》、《Spring 生态全家桶体系化实战》学习方向Java 后端AI‑Agent 大模型应用开发爱好者⭐人生格言路虽远行则将至本文是「Spring Cloud 微服务实战」系列的第一篇。文章从单体架构到微服务架构的演变讲起介绍 Spring Cloud 生态的核心组件随后基于 Nacos 2.5.1 手把手搭建父工程与订单、库存两个子服务实现服务注册与发现、按服务名调用并讲解命名空间、分组与负载均衡机制。读完本文你可以独立搭建一套基于 Nacos 的微服务调用链路。系列文章导航《Spring Cloud 微服务实战一还在硬编码服务地址Nacos 注册中心从零搭建》本篇《Spring Cloud 微服务实战二改个配置还要重启服务Nacos 配置中心 OpenFeign 实战》《Spring Cloud 微服务实战三一个服务挂了凭什么拖垮整个系统Sentinel 限流熔断实战》《Spring Cloud 微服务实战四每个请求都直连服务你的集群缺一个 Gateway 门卫》环境与版本说明跟随本文实战需要提前准备如下环境环境版本要求JDK8 或 11Nacos Server 的运行要求Nacos Server2.5.1Spring Boot2.6.11Spring Cloud2021.0.4Spring Cloud Alibaba2021.0.4.0构建工具Maven 3.6开发工具IntelliJ IDEA社区版即可提示Spring Boot、Spring Cloud、Spring Cloud Alibaba 三者的版本存在对应关系混用版本可能导致启动报错版本对应关系可查阅 Spring Cloud Alibaba 官方 Wiki。本系列以 Spring Boot 2.x 为基线暂不涉及 3.x。一、微服务架构介绍开始正文之前默认你已经具备以下基础掌握 SSM、Spring Boot 的基本使用熟悉 Maven、Git 的常规操作本地已安装 JDK 8 或 JDK 11 环境。1.1 架构演变软件架构的演进大致经历了三个阶段单体架构、SOA 架构和微服务架构。单体架构所有功能模块集中在一个工程中开发与部署即 All in One 模式。SOA架构面向服务的架构属于单体向微服务过渡的形态。它通常依赖 ESB企业服务总线、WebService 等较重的基础设施在当下的大型项目中已较少采用。微服务架构这一架构风格由 Martin Fowler 提出官方阐述见https://martinfowler.com/articles/microservices.html其核心定义如下In short, the microservice architectural style 1 is an approach to developing a single application as a suite of small services, each running in its own process and communicating with lightweight mechanisms, often an HTTP resource API. These services are built around business capabilities and independently deployable by fully automated deployment machinery. There is a bare minimum of centralized management of these services, which may be written in different programming languages and use different data storage technologies. 简而言之微服务架构风格1是一种将单个应用程序开发为一套小型服务的方法每个服务都在自己的进程中运行并与轻量级机制通常是HTTP资源API通信。这些服务围绕业务能力构建并可通过全自动部署机制独立部署。这些服务的集中管理最低限度这些服务可能用不同的编程语言编写并使用不同的数据存储技术。对这段定义做进一步归纳可以得到微服务架构的几个关键特征微服务是一种架构风格而非强制标准将单体应用按业务能力拆分为多个小型服务多个服务共同组成完整的产品功能每个服务可以独立部署互不影响服务之间通常采用 HTTP 等轻量级方式进行通信拆分时一般按业务领域划分边界也可以将单个独立功能抽象为一个服务借助 DevOps 实现自动化部署本系列后续内容会涉及不同服务可以采用不同的编程语言与技术栈实现。最后区分三个容易混淆的概念微服务架构一种架构思想微服务拆分出来的具体服务实例例如上图中的商品服务微服务框架落地微服务架构思想的技术体系如 Spring Cloud。1.2 SpringCloud生态官方地址 https://spring.io/projects/spring-cloud本系列将围绕 Spring Cloud 生态中的以下组件展开Spring Cloud AlibabaNacos注册中心与配置中心Spring CloudOpenFeign声明式远程调用Spring Cloud AlibabaSentinel限流熔断降级Spring CloudGateway网关链路追踪Sleuth ZipkinSkyWalking 本系列不涉及说明本系列聚焦组件的应用与落地不涉及底层源码分析。二、Nacos注册中心2.1 注册中心考虑这样一个场景订单服务需要调用库存服务但它并不知道库存服务的 IP 和端口。如果把库存服务的地址硬编码在订单服务中会带来明显的耦合问题——库存服务地址变更、集群节点增减时订单服务都必须跟着修改和维护。注册中心正是为解决这一问题而生的每个服务启动时将自己的基本信息服务名、IP、端口等注册到 Nacos当某个服务需要调用其他服务时先从 Nacos 查询目标服务的地址信息再发起调用。这样服务之间的依赖就从硬编码地址变成了按服务名动态发现。2.2 Nacos安装Nacos Server 既可以在 Windows 下本地运行也可以部署到 Linux 环境本地开发直接使用官方安装包即可。需要注意的是Nacos Server 要求本地 Java 环境为 JDK 8 或 JDK 11通过java -version确认。2.5.1 版本下载地址https://download.nacos.io/nacos-server/nacos-server-2.5.1.zip点击即可直接下载最好去官网下载页获取最新版本。打开终端Windows 下为 cmd准备启动 Nacos 服务进入解压后的 bin 目录执行启动命令Windowsstartup.cmd -m standaloneLinux/Macsh startup.sh -m standalone启动成功要看到这个日志启动成功后浏览器访问 Nacos 提供的图形化控制台http://localhost:8848/nacos2.3 Nacos初体验注册中心2.3.1 构建父工程并管理版本在开始客户端开发之前先明确一个前提Spring Cloud 构建在 Spring Boot 之上而 Spring Boot、Spring Cloud、Spring Cloud Alibaba 三者的版本存在严格的对应关系。版本对应关系可查阅https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E版本不一致时部分组件的使用细节会出现差异建议与本文保持一致。本系列以 Spring Boot 2.x 为基线。首先构建一个普通的 Maven 父工程在 pom.xml 中完成四件事将工程的 packaging 设置为 pom继承 Spring Boot 的 parent 并指定版本声明 Spring Cloud 的版本声明 Spring Cloud Alibaba 的版本。?xml version1.0 encodingUTF-8?projectxmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.6.11/versionrelativePath//parentgroupIdcom.study/groupIdartifactIdspringcloud/artifactIdversion1.0-SNAPSHOT/versionpackagingpom/packagingpropertiesspring-cloud.version2021.0.4/spring-cloud.versionspring-cloud-alibaba.version2021.0.4.0/spring-cloud-alibaba.version/propertiesdependencyManagementdependenciesdependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-dependencies/artifactIdversion${spring-cloud.version}/versiontypepom/typescopeimport/scope/dependencydependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-alibaba-dependencies/artifactIdversion${spring-cloud-alibaba.version}/versiontypepom/typescopeimport/scope/dependency/dependencies/dependencyManagement/project2.3.2 准备库存服务库存服务stock的搭建分为五步1、在父工程下创建子工程2、引入 Web 与 Nacos 服务发现依赖dependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId/dependency/dependencies3、编写启动类并添加EnableDiscoveryClient注解开启服务注册与发现packagecom.study;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.cloud.client.discovery.EnableDiscoveryClient;SpringBootApplicationEnableDiscoveryClientpublicclassStockStarterApp{publicstaticvoidmain(String[]args){SpringApplication.run(StockStarterApp.class,args);}}4、在 application.yml 中配置服务名与 Nacos 地址spring:application:name:stockcloud:nacos:discovery:server-addr:127.0.0.1:88485、启动服务在 Nacos 控制台的服务列表中可以看到 stock 已注册成功2.3.3 准备订单服务订单服务order的搭建步骤与库存服务完全一致仅需调整配置文件服务名改为 order并将端口固定为 80。spring:application:name:ordercloud:nacos:discovery:server-addr:127.0.0.1:8848server:port:80启动后同样可以在 Nacos 控制台确认注册结果2.3.4 库存服务提供接口在 stock 服务中提供一个对外的测试接口用于后续验证服务间调用packagecom.study.controller;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RestController;RestControllerpublicclassStockController{GetMapping(/stock/test)publicStringtest(){returnstock test!;}}启动后访问http://localhost:8080/stock/test确认接口可以正常响应2.3.5 订单服务准备接口访问库存服务首先用最原始的方式实现调用在启动类中注册 RestTemplate Bean由 OrderController 直接访问库存服务的固定地址。注意此时地址是硬编码的尚未接入 Nacos。packagecom.study.controller;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RestController;importorg.springframework.web.client.RestTemplate;RestControllerpublicclassOrderController{// restTemplate是启动类里构建的AutowiredprivateRestTemplaterestTemplate;GetMapping(/order/test)publicStringtest(){//1、 直接访问库存服务的/stock/test接口获取数据StringresultrestTemplate.getForObject(http://localhost:8080/stock/test,String.class);//2、 响应数据returnOrder Test get result;}}确认硬编码地址可以正常调用后下面将其改造为基于 Nacos 的服务名调用。改造只需两步给 RestTemplate Bean 追加LoadBalanced注解BeanLoadBalancedpublicRestTemplaterestTemplate(){returnnewRestTemplate();}然后将调用地址中的localhost:8080替换为服务名stock。预期效果是 RestTemplate 发起请求时由 LoadBalancer 将 stock 服务名从 Nacos 解析为具体的 IP 和端口。但实际启动后会发现调用报错这是因为在 Spring Cloud 2021.x 版本中Ribbon 已被移除负载均衡能力需要显式引入 LoadBalancer 依赖。在 order 服务中补充依赖即可解决dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-loadbalancer/artifactId/dependency再次访问服务名成功被解析调用正常返回2.4 命名空间和分组了解默认情况下服务的注册与发现都发生在 Nacos 的 public 命名空间、DEFAULT_GROUP 分组下。实际项目中通常利用命名空间区分环境dev/test/prod利用分组对服务做进一步归类。这两者都可以在 yml 中指定。先在 Nacos 控制台创建一个新的命名空间然后让 order 服务连接该命名空间此时 stock 服务仍然注册在 public 命名空间下而 order 服务已改为从 dev 命名空间查找服务自然找不到 stock调用随之报错——这正验证了命名空间的隔离效果分组的用法类似。将 order 服务的注册与发现分组设置为 PDD_GROUP 后它只会在该分组内查找服务由于 stock 服务注册在 DEFAULT_GROUP 下order 在 PDD_GROUP 中无法找到它调用失败符合预期2.5 负载均衡了解需要明确一点负载均衡并不是 Nacos 本身的职责而是由客户端侧的Ribbon 或 LoadBalancer组件完成的低版本 Spring Cloud 默认集成 Ribbon当前版本需要手动引入 LoadBalancer。默认采用轮询策略即请求依次分发到各服务节点无需额外配置。虽然也支持权重等策略但实际项目中默认轮询已能满足大多数场景。为了直观观察轮询效果对 stock 服务的 test 接口稍作改造在返回结果中追加当前服务端口packagecom.study.controller;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RestController;RestControllerpublicclassStockController{Value(${server.port})privateStringserverPort;GetMapping(/stock/test)publicStringtest(){returnstock test!serverPort;}}首次启动时可能遇到占位符解析失败的错误原因是配置文件中尚未声明server.port补充对应配置后重启即可先启动一个 8080 端口的 stock 实例。为了验证集群效果再通过 IDEA 的启动配置启动第二个 stock 实例端口 8081。新版 IDEA 需要先开启Allow multiple instances多实例运行选项然后在 IDEA 中新增一个启动配置以 8081 端口启动 stock 服务两个实例启动成功后可以在 Nacos 控制台看到 stock 服务下挂载了两个集群节点注意同一集群的多个实例必须使用相同的服务名服务名不同会被识别为两个独立的服务。此时反复访问订单接口返回的端口号会在 8080 与 8081 之间交替出现即默认的轮询效果三、总结本文完成了微服务实战的第一步核心收获如下厘清了微服务架构的核心思想与 Spring Cloud 生态的技术选型。搭建父工程统一管理 Spring Boot 2.6.11、Spring Cloud 2021.0.4、Spring Cloud Alibaba 2021.0.4.0 三大版本。基于 Nacos 完成订单、库存服务的注册与发现配合 LoadBalancer 实现按服务名调用。验证了命名空间与分组的隔离效果以及负载均衡的默认轮询机制。下一篇预告使用 Nacos 配置中心集中管理配置文件并实现动态刷新再用 OpenFeign 优雅地简化跨服务 HTTP 调用。感兴趣的同学记得 点赞 关注第一时间获取更新通知
返回列表