Nacos 在微服务项目中的实战应用

打印 上一主题 下一主题

主题 837|帖子 837|积分 2511

1. 引言

在当今的微服务架构中,服务发现和配置管理是两个核心寻衅。Nacos 作为阿里巴巴开源的服务发现和配置管理平台,为这些寻衅提供了强大的办理方案。本文将深入探究 Nacos 在实际项目中的应用,包括服务注册与发现、配置管理、负载平衡等方面。
2. 项目背景

发一个电子商务平台,该平台包含以下微服务:


  • 用户服务 (user-service)
  • 商品服务 (product-service)
  • 订单服务 (order-service)
  • 支付服务 (payment-service)
  • 库存服务 (inventory-service)
3. Nacos 在服务注册与发现中的应用

3.1 服务注册

每个微服务都需要向 Nacos 注册自己。以用户服务为例:
  1. @SpringBootApplication
  2. @EnableDiscoveryClient
  3. public class UserServiceApplication {
  4.     public static void main(String[] args) {
  5.         SpringApplication.run(UserServiceApplication.class, args);
  6.     }
  7. }
复制代码
在 application.properties 中配置:
  1. spring.application.name=user-service
  2. spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
复制代码
3.2 服务发现

当订单服务需要调用用户服务时,可以利用 @LoadBalanced 注解的 RestTemplate:
  1. @Configuration
  2. public class RestTemplateConfig {
  3.     @Bean
  4.     @LoadBalanced
  5.     public RestTemplate restTemplate() {
  6.         return new RestTemplate();
  7.     }
  8. }
  9. @Service
  10. public class OrderService {
  11.     @Autowired
  12.     private RestTemplate restTemplate;
  13.     public UserInfo getUserInfo(Long userId) {
  14.         return restTemplate.getForObject("http://user-service/user/" + userId, UserInfo.class);
  15.     }
  16. }
复制代码
4. Nacos 在配置管理中的应用

4.1 配置中心设置

在 Nacos 控制台创建配置:


  • Data ID: order-service.yaml
  • Group: DEFAULT_GROUP
  • 配置格式: YAML
配置内容:
  1. order:
  2.   timeout: 30
  3.   max-amount: 10000
复制代码
4.2 在服务中利用配置

在 order-service 的 bootstrap.properties 中:
  1. spring.application.name=order-service
  2. spring.cloud.nacos.config.server-addr=127.0.0.1:8848
  3. spring.cloud.nacos.config.file-extension=yaml
复制代码
利用配置:
  1. @RefreshScope
  2. @RestController
  3. @RequestMapping("/order")
  4. public class OrderController {
  5.     @Value("${order.timeout}")
  6.     private int orderTimeout;
  7.     @Value("${order.max-amount}")
  8.     private int maxAmount;
  9.     @GetMapping("/config")
  10.     public String getConfig() {
  11.         return "Order timeout: " + orderTimeout + ", Max amount: " + maxAmount;
  12.     }
  13. }
复制代码
5. Nacos 实现动态路由

利用 Nacos 的动态配置功能,我们可以实现网关的动态路由:
在 Nacos 中创建路由配置:
  1. spring:
  2.   cloud:
  3.     gateway:
  4.       routes:
  5.         - id: user_route
  6.           uri: lb://user-service
  7.           predicates:
  8.             - Path=/user/**
  9.         - id: order_route
  10.           uri: lb://order-service
  11.           predicates:
  12.             - Path=/order/**
复制代码
在网关服务中监听配置变化:
  1. @Configuration
  2. public class DynamicRouteConfig {
  3.     @Autowired
  4.     private RouteDefinitionWriter routeDefinitionWriter;
  5.     @Autowired
  6.     private NacosConfigManager nacosConfigManager;
  7.     @PostConstruct
  8.     public void initDynamicRoute() throws NacosException {
  9.         nacosConfigManager.getConfigService().addListener(
  10.             "gateway-routes.yaml", "DEFAULT_GROUP", new Listener() {
  11.                 @Override
  12.                 public void receiveConfigInfo(String configInfo) {
  13.                     updateRoutes(configInfo);
  14.                 }
  15.             }
  16.         );
  17.     }
  18.     private void updateRoutes(String configInfo) {
  19.         // 解析配置并更新路由
  20.     }
  21. }
复制代码
6. Nacos 实现服务限流

结合 Sentinel,我们可以利用 Nacos 动态调整限流规则:
在 Nacos 中配置限流规则:
  1. [
  2.   {
  3.     "resource": "orderCreate",
  4.     "limitApp": "default",
  5.     "grade": 1,
  6.     "count": 100,
  7.     "strategy": 0,
  8.     "controlBehavior": 0,
  9.     "clusterMode": false
  10.   }
  11. ]
复制代码
在应用中利用限流规则:
  1. @Configuration
  2. public class SentinelConfig {
  3.     @Bean
  4.     public SentinelDataSource dataSource() {
  5.         return new NacosDataSource("localhost:8848", "DEFAULT_GROUP", "sentinel-rules");
  6.     }
  7. }
  8. @RestController
  9. @RequestMapping("/order")
  10. public class OrderController {
  11.     @SentinelResource(value = "orderCreate", blockHandler = "handleOrderBlock")
  12.     @PostMapping("/create")
  13.     public String createOrder() {
  14.         // 创建订单逻辑
  15.     }
  16.     public String handleOrderBlock(BlockException ex) {
  17.         return "Service is busy, please try again later";
  18.     }
  19. }
复制代码
7. Nacos 实现灰度发布

利用 Nacos 的元数据功能,我们可以实现灰度发布:
在服务注册时添加版本信息:
  1. spring.cloud.nacos.discovery.metadata.version=1.0
复制代码
在网关中根据版本号路由请求:
  1. @Component
  2. public class VersionRoutePredicateFactory extends AbstractRoutePredicateFactory<VersionRoutePredicateFactory.Config> {
  3.     @Override
  4.     public Predicate<ServerWebExchange> apply(Config config) {
  5.         return exchange -> {
  6.             // 获取请求中的版本号
  7.             String version = exchange.getRequest().getHeaders().getFirst("version");
  8.             // 根据版本号选择对应的服务实例
  9.         };
  10.     }
  11.     public static class Config {
  12.         private String version;
  13.         // getter and setter
  14.     }
  15. }
复制代码
8. 最佳实践与注意事项

8.1 合理利用命名空间和分组
8.2 配置加密敏感信息
8.3 实现高可用部署
8.4 监控和告警设置
8.5 定期备份配置
结论

Nacos 在微服务架构中扮演着至关重要的角色,它不仅提供了服务发现和配置管理的基本功能,还能够与其他组件协同工作,实现动态路由、服务限流、灰度发布等高级特性。在实际应用中,需要根据详细的业务需求和技术栈来选择和配置 Nacos 的各项功能。同时,也要注意性能优化、安全性和高可用性等方面的考虑,以确保 Nacos 在生产情况中的稳固运行。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

莱莱

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表