• SpringCloudalibaba2


    一、nacos简介

    Nacos(全称为"Nano Service")是一个用于动态服务发现、配置管理和服务元数据的开源平台。它由阿里巴巴集团于2018年开源,并逐渐成为云原生应用中的重要组件之一。

    Nacos提供了以下主要功能:

    1. 服务发现和注册:Nacos允许服务实例自动注册和发现,使得服务之间的通信更加简单和高效。它支持多种服务发现方式,包括基于DNS和基于HTTP的方式。

    2. 动态配置管理:Nacos可以集中管理应用程序的配置信息,通过动态刷新机制,使得配置的变更可以实时生效,而不需要重启应用程序。这样可以大大简化了应用程序的配置管理和维护。

    3. 服务元数据管理:Nacos可以为服务实例提供一些额外的元数据信息,包括权重、健康检查等。这些元数据信息可以用于实现更灵活的服务路由、负载均衡等功能。

    4. 服务路由:Nacos提供了灵活的服务路由配置功能,可以根据服务实例的元数据信息和路由规则进行动态的路由配置,以实现更复杂的服务调用策略。

    5. 服务限流和降级:Nacos可以通过配置的方式实现服务限流和降级功能,保护系统在高并发情况下的稳定性和可用性。

    总的来说,Nacos是一个用于构建云原生架构的核心组件,它为微服务架构提供了强大的动态服务发现和配置管理能力,帮助开发者简化了应用程序的开发和运维工作。

    二、nacos安装与入门

    2.1 下载解压

    Releases · alibaba/nacos · GitHub

    2.2 使用cmd开启

    进入nacos的bin目录使用cmd

    执行下面命令

     startup.cmd -m standalone

    2.3 注意事项

    如果提示此处不应该有命令 提示用jdk 1.8版本以上

    打开 

     

    2.4 登录

    启动成功

     登录

    http://localhost:8848/nacos

    输入账号密码

    账号密码都是nacos

    三、将springCloud项目注册到nacos

    项目结构

    3.1 加依赖

    在service中的pom.xml中加入依赖

    1. <dependency>
    2. <groupId>com.alibaba.cloudgroupId>
    3. <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
    4. dependency>

    3.2 注意事项

    如果用的是网线的话关闭WLAN

    之前用过虚拟机的话关闭虚拟机网络

    3.3 application.properties文件配置

     

    1. server.port=8081
    2. spring.application.name=product
    3. #设置注册中心的地址
    4. spring.cloud.nacos.discovery.server-addr=localhost:8848
    5. server.port=8082
    6. spring.application.name=product
    7. #设置注册中心的地址
    8. spring.cloud.nacos.discovery.server-addr=localhost:8848

    3.4 在nacos中查看

    四、使用负载均衡

    4.1 轮询

    加入依赖

    1. <dependency>
    2. <groupId>org.springframework.cloudgroupId>
    3. <artifactId>spring-cloud-starter-loadbalancerartifactId>
    4. dependency>

     两个product的controller

    在orders的controller中写入以下代码

    1. package org.example.controller;
    2. import org.example.entity.Product;
    3. import org.example.service.ProductOpenFeign;
    4. import org.springframework.cloud.client.ServiceInstance;
    5. import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
    6. import org.springframework.web.bind.annotation.GetMapping;
    7. import org.springframework.web.bind.annotation.PathVariable;
    8. import org.springframework.web.bind.annotation.RequestMapping;
    9. import org.springframework.web.bind.annotation.RestController;
    10. import org.springframework.web.client.RestTemplate;
    11. import javax.annotation.Resource;
    12. @RequestMapping
    13. @RestController
    14. public class OrdersController {
    15. @Resource
    16. private LoadBalancerClient loadBalancerClient;
    17. @Resource
    18. private RestTemplate restTemplate;
    19. /**
    20. * 轮询
    21. * @param pid
    22. * @return {@link Object}
    23. */
    24. @GetMapping("/order1/{pid}")
    25. public Object order(@PathVariable Integer pid) {
    26. ServiceInstance choose = loadBalancerClient.choose("product");
    27. String url = String.format("http://%s:%s", choose.getHost(), choose.getPort() +"/pro/"+ pid);
    28. System.out.println(url);
    29. Product forObject = restTemplate.getForObject(url, Product.class);
    30. return forObject;
    31. }
    32. }

    orders启动类加入注解

    @EnableDiscoveryClient //  当前的微服务是可以被nacos发现的

     

    4.2 随机

    在orders的controller中写入以下代码

    1. @Resource
    2. private DiscoveryClient discoveryClient;
    3. /**
    4. * 随机
    5. * @param pid
    6. * @return {@link Object}
    7. */
    8. @GetMapping("/order2/{pid}")
    9. public Object addOrder3(@PathVariable Integer pid){
    10. List pro = discoveryClient.getInstances("product");
    11. int size = pro.size();
    12. int i = new Random().nextInt(size);// =size-1
    13. ServiceInstance choose = pro.get(i);
    14. String url = String.format("http://%s:%s", choose.getHost(), choose.getPort() + "/pro/"+pid);
    15. System.out.println(url);
    16. Product forObject = restTemplate.getForObject(url, Product.class);
    17. return forObject;
    18. }

    五、使用openFeign

    5.1 轮询

    加依赖

    1. <dependency>
    2. <groupId>org.springframework.cloudgroupId>
    3. <artifactId>spring-cloud-starter-openfeignartifactId>
    4. dependency>

    在orders中创建一个service层

    写一个ProductOpenFeign接口

    1. @FeignClient(value = "product")
    2. public interface ProductOpenFeign {
    3. @GetMapping("/pro/{pid}")
    4. public Product getProductByID(@PathVariable Integer pid);
    5. }

     在orders的启动类中加入注解

    @EnableFeignClients//使用openFeign

    在orders的controller中加写入代码

    1. @Resource
    2. private ProductOpenFeign productOpenFeign;
    3. /**
    4. * 使用openFeign
    5. * @param pid
    6. * @return {@link Product}
    7. */
    8. @GetMapping("/order3/{pid}")
    9. private Product order3(@PathVariable Integer pid){
    10. Product productByID = productOpenFeign.getProductByID(pid);
    11. return productByID;
    12. }

    5.2 使用openFeign随机

    写一个config类

    1. public class LoadBalancerConfig {
    2. @Bean
    3. ReactorLoadBalancer randomLoadBalancer(Environment environment,
    4. LoadBalancerClientFactory loadBalancerClientFactory) {
    5. String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME); //loadbalancer.client.name
    6. // 对应的需要进行负载均衡的名字是什么
    7. System.out.println("======"+name);
    8. // product
    9. return new RandomLoadBalancer(loadBalancerClientFactory.
    10. getLazyProvider(name, ServiceInstanceListSupplier.class), name);
    11. }
    12. }

    在orders的启动类中添加注解

    @LoadBalancerClient(value = "product",configuration = LoadBalancerConfig.class)

     controller中还是用刚才的

    5.3 服务熔断

    加入依赖

    1. <dependency>
    2. <groupId>com.alibaba.cloudgroupId>
    3. <artifactId>spring-cloud-starter-alibaba-sentinelartifactId>
    4. dependency>

    创建一个刚才的接口实现类

    1. @Service
    2. public class ProductOpenFeignImpl implements ProductOpenFeign {
    3. @Override
    4. public Product getProductByID(Integer pid) {
    5. return new Product(0,"有错误!");
    6. }
    7. }

    在接口中写入注解

    @FeignClient(value = "product",fallback = ProductOpenFeignImpl.class)

    在orders的启动类中注释掉注解

  • 相关阅读:
    多分类损失函数(机器学习)
    前后端分离项目(九):实现"添加"功能(后端接口)
    Element ui table表格内容超出隐藏显示省略号
    数据库实践 Hw09
    Nginx: [emerg] bind() to 0.0.0.0:8088 failed (13: Permission denied)
    十五、SQL Limit(干货版)
    MySQL存储引擎
    opencv c++ 边缘提取
    连接MySQL时报错:Public Key Retrieval is not allowed的解决方法
    华为OD机试真题-学生重新排队-2024年OD统一考试(C卷)
  • 原文地址:https://blog.csdn.net/weixin_68193389/article/details/134405017