第二次课:nacos服务注册与发现

飞一样的编程
飞一样的编程
擅长邻域:Java,MySQL,Linux,nginx,springboot,mongodb,微信小程序,vue

分类: springboot 专栏: 新版springcloud分布式学习 标签: nacos学习

2024-04-23 11:40:20 392浏览

nacos服务注册与发现

前言

我们学的是nacos的服务注册和发现,Eureka就暂时不学了,这个没nacos火了,感兴趣的小伙伴可以去自学了解下。

提一下消费者和提供者的概念。

上次课那种写法存在的问题分析:

    //服务提供者的url是写死的
    //如果服务提供者是集群模式 难道我们要自己写负载均衡的算法吗
    String url= "http://localhost:81/user/"+order.getUserId();
    User user = restTemplate.getForObject(url, User.class);
    order.setUser(user);
    return  order;

认识nacos

Nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件。相比Eureka功能更加丰富,在国内受欢迎程度较高。

nacos的基本使用

下载nacos服务器

https://github.com/alibaba/nacos/releases

修改bin目录里面的startup.cmd文件 集群模式改为单机模式

set MODE="cluster" 改为下面的

set MODE="standalone"

启动后直接访问localhost:8848/nacos

默认的账号密码都是nacos

springboot使用nacos

依赖


<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
   <version>3.0.0</version>
</parent>
  <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
      <version>2022.0.0.0-RC1</version>
  </dependency>

配置文件

spring:
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
        ip: 127.0.0.1
  application:
    name: user-service

开关注解

在微服务的启动类上加@EnableDiscoveryClient.表示是该微服务要注册到nacos的服务端

@EnableDiscoveryClient
public class UserApp {

启动项目后,在nacos的控制台看到的效果如下

配置负载均衡

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

修改远程调用的url

之前是写死的localhost:81现在变成访问应用名

//服务提供者的url是写死的
        //如果服务提供者是集群模式 难道我们要自己写负载均衡的算法吗
//        String url= "http://localhost:81/user/"+order.getUserId();
        String url= "http://user-service/user/"+order.getUserId();
        User user = restTemplate.getForObject(url, User.class);

还是访问不到user-service怎么解决

在消费者端加依赖

 <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-loadbalancer</artifactId>
    <version>4.0.0</version>
</dependency>

参考文章:https://blog.csdn.net/white0718/article/details/131788774

nacos两种健康检查模式

1.client上报模式

  • 客户端通过心跳上报方式告知服务端(nacos注册中心)健康状态;
  • 默认心跳间隔5秒;
  • nacos会在超过15秒未收到心跳后将实例设置为不健康状态;healthy改为false
  • 超过30秒将实例删除;

2 服务端主动检测

  • nacos主动探知客户端健康状态,默认间隔为20秒;
  • 健康检查失败后实例会被标记为不健康,不会被立即删除。
  • ephemeral为true对应的是服务健康检查模式中的 client 模式,为false对应的是 server 模式。(临时实例和非临时实例,非临时实例不会被剔除)

环境隔离

在不同的命名空间下是相互隔离的,无法相互调用

nacos服务分级存储模型

集群和实例是不一样的

测试的时候发现还是轮询的方式,所以要改变默认策略,咱们高版本已经不能用rabbon了

NacosRule负载均衡

演示消费者访问提供者集群的时候,优先选择本地集群,本地集群没有的情况下就只能跨集群访问(就近原则)

NacosRule负载均衡

演示消费者访问提供者集群的时候,优先选择本地集群,本地集群没有的情况下就只能跨集群访问(按集群权重分配)

配置类


@Configuration
public class RestConfig {
    @Resource
    NacosDiscoveryProperties nacosDiscoveryProperties;
    @Bean
    public ReactorLoadBalancer<ServiceInstance> nacosLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory) {
        String name = environment.getProperty("loadbalancer.client.name");
        return new NacosLoadBalancer(
                loadBalancerClientFactory.getLazyProvider(name,
                        ServiceInstanceListSupplier.class), name, nacosDiscoveryProperties);
    }


}

启动类


@SpringBootApplication
@EnableDiscoveryClient
@LoadBalancerClients(defaultConfiguration = {RestConfig.class})
public class OrderDemoApplication {
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

    public static void main(String[] args) {
        SpringApplication.run(OrderDemoApplication.class, args);
    }

}

核心的就是@LoadBalancerClients(defaultConfiguration = {RestConfig.class})

参考文章:

https://blog.csdn.net/xaiobit_hl/article/details/134283093


实例的权重设置

实际用途:可以做项目的平滑升级,先将要升级的微服务其中的一个实例权重设置成0 ,代码部署更新后再调高权重即可,用户是无感知的,就不用凌晨升级代码了。

好博客就要一起分享哦!分享海报

此处可发布评论

评论(1展开评论

飞一样的编程 能力:470

2024-04-24 11:14:46

spring: cloud: loadbalancer: ribbon: enabled: false
点击查看更多评论

展开评论

您可能感兴趣的博客

客服QQ 1913284695