Nacos注册中心

Nacos注册中心,第1张

目录

Nacos服务搭建: 

配置搭建总结

服务多级存储(给服务的实例配置集群): 

Nacos负载均衡-实现集群优先

 服务实例权重的配置

nacos环境隔离

Nacos和EureKa的总结区别:

对服务配置文件进行更新

场景:

 如何配置

实现热更新:

多环境(测试+开发+生产)配置共享

1.先配置全局环境配置(支持多环境)

2.分别在具体环境的配置文件和全局环境配置文件中增加属性配置

3.在配置类中将这些新属性注入,并在控制器中获取json数据,看谁优先级更高

Nacos集群搭建


Nacos服务搭建: 

里面可以对服务进行注册与发现

对于EureKa的改动,我们需要修改依赖,并且注释原本在order-service以及user-service服务中的原有的EureKa-client依赖,并添加nacos依赖

服务注册到Nacos步骤

1.首先在父工程中导入alibaba的cloud依赖

  
            
                com.alibaba.cloud
                spring-cloud-alibaba-dependencies
                2.2.5.RELEASE
            

2.然后在服务项目中配置Nacos注册依赖(注册发现服务的依赖)

 
            com.alibaba.cloud
            spring-cloud-starter-alibaba-nacos-discovery
            2.2.5.RELEASE
        

3.在yaml中进行配置,配置映射,服务名称,以及对应的Nacos服务端口

 application:
    name: orderservice # user的服务名称
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 # nacos服务地址

配置搭建总结


服务多级存储(给服务的实例配置集群): 

引:为了给服务减轻压力,我们可以给服务的实例们(8081、8082...)配置集群->长沙集群,上海集群等等... 

给服务实例配置集群

1.修改yaml文件,给Nacos的配置加上cluster节点名称即可

cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 # nacos服务地址
        cluster-name: shanghai # 集群名称

 2.然后给对应的实例进行启动即可,(不要启动错了,不然会覆盖之前的集群名称)

集群调用问题:

服务调用尽可能选择本地集群的服务,不然延迟会很高


Nacos负载均衡-实现集群优先

步骤:

在yaml文件中对需要调用服务采用Nacos负载均衡策略,然后重启即可

userservice: #指定服务
  ribbon: # 配置负载均衡策略
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule

 策略:优先本地集群,如果没有的话,就随机;

如果没有本地集群,说明只能跨集群调用服务——>(耗时较长,毕竟调用的服务在另一个地方),会出现警告 


 服务实例权重的配置

 

直接在Nacos页面对服务实例修改权重即可

 场景:服务怎样做到用户不下线,还能升级服务?

在产品更新时,我们可以对一个服务实例的权重降到很低,那么用户请求就很难请求到这个服务上了,那么我们就可以对其进行升级,升级完毕后,再将权重慢慢调大,这样就可以满足用户,也可以满足服务; 


nacos环境隔离

没设置命名空间的时候,默认是public;

如果环境设置不一样,那么服务之间就不能进行访问;(实例找不到->也就是userservice服务实例);

每个namespace的id是唯一的;

配置方法:

1.在yaml配置文件加上namespace命名空间即可(先得在Nacos中创建环境)

 application:
    name: orderservice # user的服务名称
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 # nacos服务地址
        cluster-name: Hangzhou # 实例集群
        namespace:xxxx


Nacos和EureKa的总结区别:

 共同:它们都是向注册中心拉取服务信息,但是第一次会将服务信息放到服务的列表缓存中,下次拉取就直接从服务列表缓存中拿就行了,速度较快;

 Nacos:

临时实例:采用心跳检测,服务实例主动向注册中心汇报自己饿的情况(这里Nacos和EureKa都差不多,但是Nacos速度较快);——>如果服务消费者想要知道提供者服务是否挂了,得自己去向注册中心拉取服务才知道;

非临时实例:*Nacos会主动询问实例是否还存在(如果不存在)——>Nacos注册中心会立即主动推送变更消息:效率非常高;——>坏处:服务器压力会大,因为总是对服务进行访问

 区别:

Nacos支持服务端主动检测服务提供者状态:临时实例采用心跳模式,非临时实例采用服务器主动访问模式;

临时实例心跳不正常会被踢出,非临时实例则不会被剔除;

Nacos支持服务列表消息推送模式,即时更新;


对服务配置文件进行更新
场景:

如果多个服务对应的配置文件都需要更改时,可以利用配置管理,方便对配置文件进行更新,而且不需要重启,效率较高; 

 如何配置

 1.首先在Nacos中的配置列表中增加一个配置文件:文件名字:服务名称+环境+yaml

 2.然后配置一个bootstrap.yaml,里面是服务的配置信息:(服务名称,Nacos连接地址,环境,extendion拓展的yaml配置)——>注意之前的yaml配置要删除,放在bootstrap.yaml中

spring:
  application:
    name: userservice # 服务名称
  profiles:
    active: dev # 环境
  cloud:
    nacos:
      server-addr: localhost:8848 #连接nacos地址,根据服务名称进行配置拓展
      config:
        file-extension: yaml # 文件后缀

 3.然后在控制层可以进行测试

 


实现热更新:

1.使用注解@RefreshScope注解实现热更新

2.自动实现刷新利用@ConfigurationProperties:通过配置一个Properties类注入容器中,里面配置dateformat,然后注入controller中;

对比:个人觉得@RefreshScope会让代码太冗余了,如果我多个控制器都要用到扩展的配置文件中的属性,岂不是每个属性都得@Value赋值+@RefreshScope;

而@ConfigurationProperties+@Component将扩展属性全部放到容器中,我们的控制器直接注入这个组件就行了,然后get值,这样代码冗余减少了很多;

package cn.itcast.user.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * @author diao 2022/5/7
 */
@Component
@Data
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
    private String dateformat;
}
package cn.itcast.user.web;

import cn.itcast.user.config.PatternProperties;
import cn.itcast.user.pojo.User;
import cn.itcast.user.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

@Slf4j
@RestController
//@RefreshScope //完成热更新
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    /**
     * 将userservice服务拓展的配置属性(pattern.dateformat)注入
     */
//    @Value("${pattern.dateformat}")
//    private String dateformat;

    @Autowired
    private PatternProperties patternProperties;

    @GetMapping("now")
    public String now(){
        System.out.println(patternProperties.getDateformat());
       return LocalDateTime.now().format(DateTimeFormatter.ofPattern(patternProperties.getDateformat()));
    }

    /**
     * 路径: /user/110
     *
     * @param id 用户id
     * @return 用户
     */
    @GetMapping("/{id}")
    public User queryById(@PathVariable("id") Long id) {
        return userService.queryById(id);
    }
}


多环境(测试+开发+生产)配置共享

  

1.先配置全局环境配置(支持多环境)

2.分别在具体环境的配置文件和全局环境配置文件中增加属性配置

3.在配置类中将这些新属性注入,并在控制器中获取json数据,看谁优先级更高
package cn.itcast.user.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * @author diao 2022/5/7
 */
@Component
@Data
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
    private String dateformat;

    //共享环境数据
    private String envSharedValue;

    //测试在不同环境下对于相同数据的优先级
    private String data;
}


@Slf4j
@RestController
//@RefreshScope //完成热更新
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    /**
     * 将userservice服务拓展的配置属性(pattern.dateformat)注入
     */
//    @Value("${pattern.dateformat}")
//    private String dateformat;

    @Autowired
    private PatternProperties patternProperties;

    @GetMapping("now")
    public String now(){
        System.out.println(patternProperties.getDateformat());
       return LocalDateTime.now().format(DateTimeFormatter.ofPattern(patternProperties.getDateformat()));
    }

    @GetMapping("shared")
    public String getShared(){
      return patternProperties.getEnvSharedValue();
    }

    @GetMapping("test")
    public String get(){
        return patternProperties.getData();
    }
    /**
     * 路径: /user/110
     *
     * @param id 用户id
     * @return 用户
     */
    @GetMapping("/{id}")
    public User queryById(@PathVariable("id") Long id) {
        return userService.queryById(id);
    }
}

 可以在服务配置里面修改服务实例的测试环境,就不用每次去修改代码了

结果: 

 

 总结:具体环境配置优先级>全局>本地


Nacos集群搭建

nginx完成Nacos的负载均衡,mysql实现主从复制 (Nacos集群读取共享数据)

 

咱这是8g机器,开两端口就是极限了....

 

 1.先创建数据库,根据Nacos配置文件中的内容(包括:连接的数据库+username+password+所连接的数据库个数) 

2.不同nacos中的配置端口需要修改,修改成与其他Nacos不一致的

 3.在nacos中的cluster.conf配置中修改端口:也就是说当前nacos被启动,端口会是其中一个

 4.当我们启动多个nacos时,对其在地址栏进行访问,会采用负载均衡的方法,访问Nacos集群中的一个服务器;

在nginx中进行配置

 5.然后访问即可;

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/892004.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-14
下一篇 2022-05-14

发表评论

登录后才能评论

评论列表(0条)

保存