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中加入依赖

XML 复制代码
        <!--    服务注册到nacos    -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

3.2 注意事项

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

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

3.3 application.properties文件配置

XML 复制代码
server.port=8081
spring.application.name=product
#设置注册中心的地址
spring.cloud.nacos.discovery.server-addr=localhost:8848



server.port=8082
spring.application.name=product
#设置注册中心的地址
spring.cloud.nacos.discovery.server-addr=localhost:8848

3.4 在nacos中查看

四、使用负载均衡

4.1 轮询

加入依赖

XML 复制代码
       <!-- 负载均衡 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>

两个product的controller

在orders的controller中写入以下代码

java 复制代码
package org.example.controller;

import org.example.entity.Product;
import org.example.service.ProductOpenFeign;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;


@RequestMapping
@RestController
public class OrdersController {
    @Resource
    private LoadBalancerClient loadBalancerClient;
    @Resource
    private RestTemplate restTemplate;


    /**
     * 轮询
     * @param pid
     * @return {@link Object}
     */
    @GetMapping("/order1/{pid}")
    public Object order(@PathVariable Integer pid) {
        ServiceInstance choose = loadBalancerClient.choose("product");
        String url = String.format("http://%s:%s", choose.getHost(), choose.getPort() +"/pro/"+ pid);
        System.out.println(url);
        Product forObject = restTemplate.getForObject(url, Product.class);
        return forObject;
    }

}

orders启动类加入注解

java 复制代码
@EnableDiscoveryClient //  当前的微服务是可以被nacos发现的

4.2 随机

在orders的controller中写入以下代码

java 复制代码
 @Resource
    private DiscoveryClient discoveryClient;

    /**
     * 随机
     * @param pid
     * @return {@link Object}
     */
    @GetMapping("/order2/{pid}")
    public Object addOrder3(@PathVariable Integer pid){
        List<ServiceInstance> pro = discoveryClient.getInstances("product");
        int size = pro.size();
        int i = new Random().nextInt(size);// =size-1
        ServiceInstance choose = pro.get(i);
        String url = String.format("http://%s:%s", choose.getHost(), choose.getPort() + "/pro/"+pid);
        System.out.println(url);
        Product forObject = restTemplate.getForObject(url, Product.class);
        return forObject;
    }

五、使用openFeign

5.1 轮询

加依赖

XML 复制代码
      <!--使用openFeign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

在orders中创建一个service层

写一个ProductOpenFeign接口

java 复制代码
@FeignClient(value = "product")
public interface ProductOpenFeign {

    @GetMapping("/pro/{pid}")
    public Product getProductByID(@PathVariable Integer pid);
}

在orders的启动类中加入注解

java 复制代码
@EnableFeignClients//使用openFeign

在orders的controller中加写入代码

java 复制代码
  @Resource
    private ProductOpenFeign productOpenFeign;

    /**
     * 使用openFeign
     * @param pid
     * @return {@link Product}
     */
    @GetMapping("/order3/{pid}")
    private Product order3(@PathVariable Integer pid){
        Product productByID = productOpenFeign.getProductByID(pid);
        return productByID;
    }

5.2 使用openFeign随机

写一个config类

java 复制代码
public class LoadBalancerConfig {
    @Bean
    ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,
                                                            LoadBalancerClientFactory loadBalancerClientFactory) {
        String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME); //loadbalancer.client.name
        // 对应的需要进行负载均衡的名字是什么
        System.out.println("======"+name);
        // product
        return new RandomLoadBalancer(loadBalancerClientFactory.
                getLazyProvider(name, ServiceInstanceListSupplier.class), name);
    }
}

在orders的启动类中添加注解

java 复制代码
@LoadBalancerClient(value = "product",configuration = LoadBalancerConfig.class)

controller中还是用刚才的

5.3 服务熔断

加入依赖

XML 复制代码
     <!--服务熔断 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>

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

java 复制代码
@Service
public class ProductOpenFeignImpl implements ProductOpenFeign {
    @Override
    public Product getProductByID(Integer pid) {

        return new Product(0,"有错误!");
    }
}

在接口中写入注解

java 复制代码
@FeignClient(value = "product",fallback = ProductOpenFeignImpl.class)

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

相关推荐
LBuffer9 分钟前
破解入门学习笔记题三十四
java·笔记·学习
安冬的码畜日常9 分钟前
【JUnit实战3_27】第十六章:用 JUnit 测试 Spring 应用:通过实战案例深入理解 IoC 原理
spring·观察者模式·设计模式·单元测试·ioc·依赖注入·junit5
缺点内向13 分钟前
Java: 如何在Excel中添加或删除分页符?
java·excel
m0_5213290326 分钟前
java-File的创建和删除
java
August_._41 分钟前
【JAVA】基础(一)
java·开发语言·后端·青少年编程
李白的粉1 小时前
基于springboot的新闻资讯系统
java·spring boot·毕业设计·课程设计·源代码·新闻资讯系统
麦麦鸡腿堡1 小时前
Java_LinkedList底层结构
java·开发语言
whatever who cares1 小时前
android/java中gson的用法
android·java·开发语言
摇滚侠1 小时前
Spring Boot3零基础教程,为什么有Reactive-Stream 规范,响应式编程,笔记101
java·spring boot·笔记
天天摸鱼的java工程师2 小时前
八年 Java 开发手敲:SpringBoot+SpringSecurity+JWT 实战,前后分离权限注解落地就能跑
java·后端