使用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:
@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上
使用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注解生效
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的负载均衡策略
因为LoadBalancerClient
、Feign
和Ribbon
3种方式,它们的底层都是使用Ribbon做负载均衡的,而Ribbon
负载均衡默认使用的策略是ZoneAvoidanceRule
,我们要修改Ribbon
的默认策略,让它使用nacos
的权重,那么该如何配置呢?
我们进入到nacos
管理后台,添加nacos-demo-consumer.yaml
的配置,添加如下配置:
# 以下三行配置 指定 ribbon 使用nacos 的负载均衡策略 (配在 consumer 中)
nacos-demo-provider: #服务的名称
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
配置提供者的权重
消费者调用实例
参考:Nacos配置中心和服务的注册发现芋道 Spring Cloud Netflix 负载均衡 Ribbon 入门