Nacos使用

服务注册

在父工程路径下创建子工程,让子工程继承父工程的环境依赖。pom.xml 中添加 nacos 发现组件。

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

application.xml

spring:
  cloud:
    nacos:
      discovery:
        # 指定nacos server地址,与本地配置nacos地址相同
        server-addr: localhost:8848
  application:
    name: my-nacos

服务发现与调用

pom.xml 添加 discovery,完成服务发现。

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

配置类,由于RestTemplate不会自动装载的原因,手动配置注入到IOC。RestTemplate能帮助发现provider。

@Configuration
public class ConsumerConfig {

    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

}

通过 discoveryClient 发现注册到 nacos 中的 provider 服务。

@RestController
public class ConsumerController {

    @Autowired
    private DiscoveryClient discoveryClient;

    @GetMapping("/instances")
    public List<ServiceInstance> instances(){
        List<ServiceInstance> provider = discoveryClient.getInstances("provider");
        return provider;
    }
/*  
	//原写法没有使用RestTemplate的情况 
	@GetMapping("/index")
    public String index(){
        //调用provider服务的index方法
        //1.找到provider实例
        List<ServiceInstance> list = this.discoveryClient.getInstances("provider");
        int index = ThreadLocalRandom.current().nextInt(list.size());
        ServiceInstance serviceInstance = list.get(index);
        String url = serviceInstance.getUri()+"/index";

        //2.调用
        return "调用了端口为"+serviceInstance.getPort()+"的服务,返回的结果是:"+ this.restTemplate.getForObject(url,String.class);

    }*/

    @GetMapping("/index")
    public String index() {
        return this.restTemplate.getForObject("http://provider/index",String.class);
    }

}

负载均衡

配置类,新增 @LoadBalanced注解即可,默认轮询。ribbon无需再添加依赖。

轮询

@Configuration
public class ConsumerConfig {

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

}

随机

application.xml中配置,调用者中配置。

server:
  port: 8180
provider:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

Nacos权重

通用代码,新增配置类NacosWeightedRule

@Slf4j
public class NacosWeightedRule extends AbstractLoadBalancerRule {

    @Autowired
    private NacosDiscoveryProperties nacosDiscoveryProperties;

    @Override
    public void initWithNiwsConfig(IClientConfig iClientConfig) {
        //读取配置文件
    }

    @Override
    public Server choose(Object o) {
        ILoadBalancer loadBalancer = this.getLoadBalancer();
        BaseLoadBalancer baseLoadBalancer = (BaseLoadBalancer) loadBalancer;
        //获取要请求的微服务名称
        String name = baseLoadBalancer.getName();
        //获取服务发现的相关API
        NamingService namingService = nacosDiscoveryProperties.namingServiceInstance();
        try {
            Instance instance = namingService.selectOneHealthyInstance(name);
            log.info("选择的实例是port={},instance={}",instance.getPort(),instance);
            return new NacosServer(instance);
        } catch (NacosException e) {
            e.printStackTrace();
            return null;
        }
    }
}

application.xml配置NFLoadBalancerRuleClassName修改为配置类路径

server:
  port: 8180
provider:
  ribbon:
        NFLoadBalancerRuleClassName: com.southwind.configuration.NacosWeightedRule

Guess you like

Origin blog.csdn.net/after_17/article/details/117455879