使用Nacos作为配置中心和注册中心

  • 使用Nacos作为配置中心
  • 使用Nacos作为注册中心
  • 使用feign进行服务间的调用
  • 消费者模块配置Nacos的负载均衡策略


使用Nacos作为配置中心

在项目中引入依赖

<properties>
    <springboot.version>2.2.5.RELEASE</springboot.version>
    <nacos.version>2.2.0.RELEASE</nacos.version>
    <openfeign.version>2.2.2.RELEASE</openfeign.version>
</properties>
<dependencyManagement>
    <dependencies>
        <!--    Feign    -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <version>${openfeign.version}</version>
        </dependency>

        <!--    Nacos    -->
        <!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-nacos-config -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
            <version>${nacos.version}</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>${nacos.version}</version>
        </dependency>
        
        <!--    略    -->
    </dependencies>
</dependencyManagement>

添加配置文件 bootstrap.yml

server:
  port: 8881
spring:
  application:
    name: nacos-demo-provider
  profiles:
    active: dev
  cloud:
    nacos:
      config:
        # 本机
        namespace: 3f1e9911-0b9a-415f-a757-09368408eaa9
        server-addr: localhost:8848 #Nacos地址
        file-extension: yaml #这里我们获取的yaml格式的配置

nacos:

在nacos指定协议dubbo IP地址_spring


在nacos指定协议dubbo IP地址_spring cloud_02


在nacos指定协议dubbo IP地址_ribbon_03


在nacos指定协议dubbo IP地址_java_04

@RefreshScope 注解可以使 @Value("${data.code}") 的值动态刷新

使用Nacos作为注册中心

server:
  port: 8881
spring:
  application:
    name: nacos-demo-provider
  profiles:
    active: dev
  cloud:
    nacos:
      config:
        # 本机
        namespace: 3f1e9911-0b9a-415f-a757-09368408eaa9
        server-addr: localhost:8848 #Nacos地址
        file-extension: yaml #这里我们获取的yaml格式的配置
      #服务发现
      discovery:
        # 本机
        namespace: 3f1e9911-0b9a-415f-a757-09368408eaa9
        server-addr: localhost:8848 #Nacos地址
        weight: 1
//启动类加上 @EnableDiscoveryClient 注解
@EnableDiscoveryClient
@SpringBootApplication
public class NacosDemoServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(NacosDemoServiceApplication.class, args);
    }
}

启动项目即注册到nacos上

在nacos指定协议dubbo IP地址_spring cloud_05

使用feign进行服务间的调用

在API模块中定义 FeignClient

@FeignClient(name = "nacos-demo-provider", 
            fallbackFactory = DemoServiceFallback.class)
@RequestMapping("/feign_service")
public interface DemoService {
    @PostMapping("/server/say")
    String say();
}

配置熔断策略需要开启 hystrix ,进入到nacos管理后台,添加nacos-demo-consumer.yaml的配置

feign:
  hystrix:
    enabled: true
@Component
public class DemoServiceFallback implements FallbackFactory<DemoService> {

    @Override
    public DemoService create(Throwable throwable) {
        return () -> "调用失败啦";
    }
}

配置 spring.factories 使API模块中的Spring注解生效

在nacos指定协议dubbo IP地址_spring cloud_06

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
   com.kenny.api.service.DemoServiceFallback

在提供者模块中实现 DemoService

@RestController
public class DemoServiceImpl implements DemoService {
    @Override
    public String say() {
        return "服务被调用---111";
    }
}

在消费者者模块中调用 DemoService

//指定FeignClients 扫描包的路径(不再同一个模块内需配置 basePackages = {"xxx"})
@EnableFeignClients(basePackages = {"com.kenny"})
@EnableDiscoveryClient
@SpringBootApplication
public class NacosDemoConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(NacosDemoConsumerApplication.class, args);
    }
}
@RestController
@RequestMapping("/demo")
public class ConsumerController {

    @Autowired
    private DemoService demoService;

    @PostMapping("consumer")
    public void userService() {
        ArrayList<String> list = new ArrayList<>();
        for (int i = 0; i < 50; i++) {
            String say = demoService.say();
            list.add(say);
        }
        long one = list.stream().filter(o -> StringUtils.contains(o, "111")).count();
        long two = list.stream().filter(o -> StringUtils.contains(o, "222")).count();
        long three = list.stream().filter(o -> StringUtils.contains(o, "333")).count();
        long fail = list.stream().filter(o -> StringUtils.contains(o, "失败")).count();

        System.out.printf("111 --》 %s 次\n", one);
        System.out.printf("222 --》 %s 次\n", two);
        System.out.printf("333 --》 %s 次\n", three);
        System.out.printf("fail --》 %s 次\n", fail);
    }
}

消费者模块配置Nacos的负载均衡策略

因为LoadBalancerClientFeignRibbon 3种方式,它们的底层都是使用Ribbon做负载均衡的,而Ribbon负载均衡默认使用的策略是ZoneAvoidanceRule,我们要修改Ribbon的默认策略,让它使用nacos的权重,那么该如何配置呢?

我们进入到nacos管理后台,添加nacos-demo-consumer.yaml的配置,添加如下配置:

在nacos指定协议dubbo IP地址_java_07

# 以下三行配置 指定 ribbon 使用nacos 的负载均衡策略 (配在 consumer 中)
nacos-demo-provider: #服务的名称
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule

配置提供者的权重

在nacos指定协议dubbo IP地址_ribbon_08


在nacos指定协议dubbo IP地址_ribbon_09


消费者调用实例

在nacos指定协议dubbo IP地址_ribbon_10

源码地址

参考:Nacos配置中心和服务的注册发现芋道 Spring Cloud Netflix 负载均衡 Ribbon 入门