资讯动态

SpringCloud-服务注册与服务发现

发布时间:2026/8/20 14:51:33 来源:尧图企业网站定制
一、服务注册目前开源的注册中心框架有很多国内比较常见的有EurekaNetflix公司出品目前被集成在SpringCloud当中一般用于Java应用。NacosAlibaba公司出品目前被集成在SpringCloudAlibaba中一般用于Java应用。ConsulHashiCorp公司出品目前集成在SpringCloud中不限制微服务语言。以上几种注册中心都遵循SpringCloud中的API规范因此在业务开发使用上没有太大差异。由于Nacos是国内产品中文文档比较丰富而且同时具备配置管理功能因此在国内使用较多。Nacos官方网站https://nacos.io/zh-cn/服务注册:step1.添加依赖需要在item-service项目的pom.xml中添加如下依赖!--nacos 服务注册发现--dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId/dependencystep2.配置Nacos在item-service的application.yml中添加nacos地址配置如下spring:cloud:# nacos配置nacos:discovery:server-addr:192.168.12.129:8848step3.多实例启动。为了测试一个服务多个实例的情况我们配置多个item-service的部署实例二、服务发现服务的消费者要去nacos订阅服务这个过程就是服务发现步骤如下step1.引入依赖。我们在cart-service中的pom.xml中添加下面的依赖!--nacos 服务注册发现--dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId/dependency可以发现这里Nacos的依赖于服务注册时一致这个依赖中同时包含了服务注册和发现的功能。因为任何一个微服务都可以调用别人也可以被别人调用即可以是调用者也可以是提供者。因此cart-service启动同样会注册到Nacos。step2.配置Nacos。在cart-service的application.yaml中添加nacos地址配置如下spring:cloud:# nacos配置nacos:server-addr:192.168.12.168:8848step3.发现并调用服务。三、远程调用我们必须让远程调用像本地方法调用一样简单。而这就要用到OpenFeign组件了。其实远程调用的关键点就在于四个请求方式。请求路径。请求参数。返回值类型。所以OpenFeign就利用SpringMVC的相关注解来声明上述4个参数然后基于动态代理帮我们生成远程调用的代码而无需我们手动再编写非常方便。step1.添加依赖在cart-service服务的pom.xml中引入OpenFeign的依赖和loadBalancer依赖!--openFeign--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-openfeign/artifactId/dependency!--负载均衡器--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-loadbalancer/artifactId/dependencystep2.启用OpenFeign接下来我们在cart-service的CartApplication启动类上添加注解启动OpenFeign功能EnableFeignClientsSpringBootApplicationpublicclassCartApplication{publicstaticvoidmain(String[]args){SpringApplication.run(CartApplication.class,args);}}step3.编写OpenFeign客户端在cart-service中定义一个新的接口编写Feign客户端 代码如下importorg.springframework.cloud.openfeign.FeignClient;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestParam;importjava.util.List;FeignClient(item-service)publicinterfaceItemClient{GetMapping(/items)ListItemDTOqueryItemByIds(RequestParam(ids)CollectionLongids);}这里只需要声明接口无需实现方法。接口中的几个关键信息FeignClient(item-service)声明服务名称。GetMapping声明请求方式。GetMapping(/items)声明请求路径。RequestParam(ids) CollectionLong ids声明请求参数。List返回值类型。有了上述信息OpenFeign就可以利用动态代理帮我们实现这个方法并且向http://item-service/items发送一个GET请求携带ids为请求参数并自动将返回值处理为List。我们只需要直接调用这个方法即可实现远程调用了。step4.使用FeignClient我们在cart-service的service.impl.CartServiceImpl中直接调用ItemClient的方法ServiceRequiredArgsConstructorpublicclassCartServiceImplextendsServiceImplCartMapper,CartimplementsICartService{privatefinalItemClientitemClient;privatevoidhandleCartItems(ListCartVOvos){// 1.获取商品idSetLongitemIdsvos.stream().map(CartVO::getItemId).collect(Collectors.toSet());// 2.查询商品ListItemDTOitemsitemClient.queryItemByIds(itemIds);/*if (response.getStatusCode().is2xxSuccessful()) { items response.getBody(); }*/if(CollUtils.isEmpty(items)){return;}// 3.转为 id 到 item的mapMapLong,ItemDTOitemMapitems.stream().collect(Collectors.toMap(ItemDTO::getId,Function.identity()));// 4.写入vofor(CartVOv:vos){ItemDTOitemitemMap.get(v.getItemId());if(itemnull){continue;}v.setNewPrice(item.getPrice());v.setStatus(item.getStatus());v.setStock(item.getStock());}}}feign替我们完成了服务拉取、负载均衡、发送http请求的所有工作。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价