Nacos微服务笔记

简介: Nacos微服务笔记

Nacos安装


Nacos 的 Github(Tags · alibaba/nacos · GitHub)下载我们所需的 Nacos 版本,可以选择 windows 或者 Linux。 进入官网,选择合适版本,tar.gz为linux版本,zip为windows版本。下载并解压 nacos-server-1.4.3.zip,解压完成后进入 /bin 目录,运行startup.cmd脚本。然后访问管理平台:


nacos注册服务中心管理可以通过管理平台查看和配置。启动后访问如下:


管理平台:http://localhost:8848/nacos


用户名:nacos


密 码:nacos


注册中心

这里对架构CAP进行简单介绍


CAP:C 一致性 A 可用性 P 分区容错性


以下是各个注册中心的CAP原理介绍


(1)Zookeeper 和 Consul 遵循 CP 原则,保证了强一致性和分区容错性,放弃可用性,在分布式环境中,如果涉及数据存储的场景,数据一致性应该是首先被保证的,但对于服务发现来说,可用性才是最核心的,针对同一个服务,即使注册中心的不同节点保存的服务提供者信息不相同,也并不会造成灾难性的后果。因为对于服务消费者来说,能消费才是最重要的,消费者拿到不正确的服务实例信息后尝试消费一下,也胜过因为无法获取实例信息而不去消费而导致系统异常

(2)Eureka 遵循 AP 原则,保证可用性,放弃数据一致性,基本能满足注册中心所需的核心功能,但 Eureka 2.x 版本已停止开发,并且宣布如果继续使用的话,风险自负。

(3)Nacos 同时支持 AP 与 CP,默认是 AP,同时功能更丰富,与 SpringCloud Alibaba 的兼容性更好,使用更简单灵活,可以满足更多的业务场景,且支持 K8S 的集成。

在进行Springcloud项目时版本依赖一定要合适,由于本人在一开始搭建项目的时候由于版本问题折腾了一段时间,在此把版本依赖进行记录。


推荐组件版本


e9ab15ae41d83bbe379dec3f00bc6248.png


导入依赖

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

application.yml文件配置

spring: 
 application:
    name: user
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: SH//集群名字

负载均衡

导入依赖

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
        </dependency>

负载均衡配置文件

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

业务使用

@RestController
@RefreshScope
public class UserController {
    @Autowired
    OrdersMapper ordersMapper;
    String url="http://user:9201/user/";
    @Value("${pattern.dateformat}")
    private String dateformat;
    @Autowired
    RestTemplate restTemplate;
    @Autowired
    Feign feign;
    @GetMapping("/order/{id}")
    public Orders orders(@PathVariable("id") Long id, @RequestHeader(value = "token",required = false) String token){
        System.out.println(token);
        DateFormat df=new SimpleDateFormat(dateformat);
        System.out.println(df.format(new Date()));
        Orders orders = ordersMapper.selectById(id);
        User forObject = restTemplate.getForObject(url + orders.getUserId(), User.class);
       //User user = feign.findbyId(orders.getUserId());
        orders.setUser(user);
        return orders;
    }
}

配置nacos访问进行负载均衡的时候 优先访问集群内部的服务,在访问集群内部的服务实例的时候采用随机方式,配置代码如下,如果不设计以下代码,在访问的时候负载均衡默认采用轮询的方式。

user://要做配置的微服务名称
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule

实际部署中有这样的场景,服务器设备性能有差异,部分实例所在机器性能较好,另一些较差,我们希望性能好的机器承担更多的用户请求Nacos提供了权重配置来控制访问频率,权重越大则访问频率越高。可以在nacos中心配置实例权重值。

Nacos配置管理

导入依赖

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

在nacos注册中心配置列表新建provider-dev.yaml文件,微服务名-部署环境.文件类型

d7860a6357551a43d102a075ceaad14f.png

在resources中新建bootstrap.yml

spring:
  application:
    name: provider
  profiles:
    active: dev
  cloud:
    nacos:
      server-addr: localhost:8848
      config:
        file-extension: yaml
      discovery:
        cluster-name: BJ

配置完成后就可以正常的使用了。


配置热更新在业务组件上加上@RefreshScope注解就可以了


多环境配置共享,微服务启动时会从nacos中读取多个配置文件,[spring.apllication.name].yaml这个文件一定会加载,因此多环境共享配置可以写入这个文件。


多种配置优先级:服务名-profile.yaml>服务名.yaml>本地配置


Feign

导入依赖

       <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

编写Feign客户端

@FeignClient("user")
public interface Feign {
    @GetMapping("/user/{id}")
    User findbyId(@PathVariable("id") Long id);
}

Gateway

新建一个moudle

导入依赖

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

编写路由配置

spring:
  application:
    name: gateway
  cloud:
    nacos:
      server-addr: localhost:8848
    gateway:
      routes:
        - id: pro-vider
          uri: lb://provider
          predicates:
            - Path=/order/**
          filters:
            - AddRequestHeader=token,mytoken //部分
      default-filters:
         - AddRequestHeader=token,mytoken //全局

另一种全局过滤器

@Component
@Order(-1)//越小优先级越高
public class Filter implements GlobalFilter {
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest();
        MultiValueMap<String, String> queryParams = request.getQueryParams();
        String author = queryParams.getFirst("author");
        if("admin".equals(author)){
           return chain.filter(exchange);
        }
        exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
        return exchange.getResponse().setComplete();
    }
}

请求进入网关会碰到三类过滤器:当前路由的过滤器、DefaultFilter、GlobalFilter,请求路由后,会将当前路由过滤器和DefaultFilter、GlobalFilter,合并到一个过滤器链(集合)中,排序后依次执行每个过滤器。


4e3118bc75fbad4241522e200f061d9f.png由于浏览器不能执行其他网站的脚本,Ajax请求发送不出去。Gateway跨域配置代码如下

spring:
  application:
    name: gateway
  cloud:
    nacos:
      server-addr: localhost:8848
    gateway:
      routes:
        - id: pro-vider
          uri: lb://provider
          predicates:
            - Path=/order/**
          filters:
            - AddRequestHeader=token,mytoken
      globalcors:  #全局的跨域处理
        add-to-simple-url-handler-mapping: true #解决options请求拦截的问题
        corsConfigurations:
          '[/**]':
            allowedOrigins: #允许哪些网站的跨域请求
              - "http://localhost:10010"
              - "http://www.baidu.com"
            allowedMethods: #允许的跨域ajax的请求方式
              - "GET"
              - "POST"
              - "DELETE"
              - "PUT"
              - "OPTIONS"
            allowedHeaders: "*"  #允许在请求中携带的头信息
            allowCredentials: true  #是否允许携带cookie
            maxAge: 240000   #这次跨域的有效期,单位ms


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
11月前
|
人工智能 安全 Nacos
Nacos 3.0:微服务与AI融合的技术新纪元
Nacos 3.0:微服务与AI融合的技术新纪元
489 83
|
11月前
|
人工智能 安全 Java
Nacos 3.0:从微服务治理到AI服务治理的跃迁
Nacos 3.0:从微服务治理到AI服务治理的跃迁
552 5
|
11月前
|
人工智能 自然语言处理 安全
Nacos 3.0:微服务与AI融合的新一代动态治理平台
Nacos 3.0:微服务与AI融合的新一代动态治理平台
631 2
|
11月前
|
人工智能 自然语言处理 Nacos
Nacos 3.0:微服务与AI融合的全新治理平台
Nacos 3.0:微服务与AI融合的全新治理平台
403 46
|
监控 网络协议 Nacos
Nacos:构建微服务架构的基石
Nacos:构建微服务架构的基石
1020 3
|
存储 网络协议 Nacos
高效搭建Nacos:实现微服务的服务注册与配置中心
Nacos(Dynamic Naming and Configuration Service)是阿里巴巴开源的一款动态服务发现、配置管理和服务管理平台。它旨在帮助开发者更轻松地构建、部署和管理分布式系统,特别是在微服务架构中。
2937 81
高效搭建Nacos:实现微服务的服务注册与配置中心
|
Java 网络安全 Nacos
Nacos作为流行的微服务注册与配置中心,其稳定性与易用性广受好评
Nacos作为流行的微服务注册与配置中心,其稳定性与易用性广受好评。然而,“客户端不发送心跳检测”是使用中常见的问题之一。本文详细探讨了该问题的原因及解决方法,包括检查客户端配置、网络连接、日志、版本兼容性、心跳检测策略、服务实例注册状态、重启应用及环境变量等步骤,旨在帮助开发者快速定位并解决问题,确保服务正常运行。
314 5
|
Dubbo Cloud Native 应用服务中间件
阿里云的 Dubbo 和 Nacos 深度整合,提供了高效的服务注册与发现、配置管理等关键功能,简化了微服务治理,提升了系统的灵活性和可靠性。
在云原生时代,微服务架构成为主流。阿里云的 Dubbo 和 Nacos 深度整合,提供了高效的服务注册与发现、配置管理等关键功能,简化了微服务治理,提升了系统的灵活性和可靠性。示例代码展示了如何在项目中实现两者的整合,通过 Nacos 动态调整服务状态和配置,适应多变的业务需求。
631 2

热门文章

最新文章