共同学习|Spring Cloud Alibaba一一Nacos介绍

接着上篇我们介绍的Spring Cloud Alibaba,下面来继续学习构建云原生应用的动态服务发现、配置管理和服务管理平台——Nacos介绍。

共同学习|Spring Cloud Alibaba一一简介篇-CSDN博客

3、Nacos介绍

Redirecting to: https://nacos.io/

什么是nacos?

         Nacos致力于帮助您发现、配置和管理微服务。Nacos提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。

Nacos安装

1、Nacos下载

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

2、Windows运行Nacos

3、Linux运行Nacos

./startup.sh -m standalone

4.访问NacosWeb页面

http://localhost:8848/nacos

5、登录Nacos

默认的用户名密码 nacos/nacos

4、Nacos服务注册与发现

Nacos可以作为服务注册中心替代Eureka,服务注册中心,它是服务,其实例及元数据的数据库。服务实例在启动时注册到服务注册表,并在关闭时注销。服务和路由器的客户端查询服务注册表以查找服务的可用实例。服务注册中心可能会调用服务实例的健康检查API来验证它是否能够处理请求。

下面演示自定义一个服务注册到Nacos上面

1、pom文件

<parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>2.3.3.RELEASE</version>
      <relativePath/><!-- Nacos版本和SpringBoot版本需要匹配
</parent>
<groupId>com.gf</groupId>
<artifactId>springcloud-alibaba-@1-server1</artifactId>
<version>8.8.1-SNAPSHOT</version>
<dependencies>
   <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-web</artifactId>
   </dependency>
    <!-- 该服务注册到nacos上面,需要导入这个依赖-->
   <dependency>
        <groupId>com.alibaba.cloud</groupId>
       <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
   </dependency>
</dependencies>
<!-- SpringCloudAlibaba版本-->
<dependencyManagement>
      <dependencies>
           <dependency>
                 <groupId>com.alibaba.cloud</groupId>
                 <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.1.8.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
           </dependency>
       </dependencies>
</dependencyManagement>

2、yml

server:
    port: 8081
spring:
    application:
        name:  server-provider
    cloud:
       nacos:
          discovery:
              server-addr: 127.8..1:8848 # 注册到nacos上的地址
management:
    endpoints:
        web :
            exposure:
                  include: '*'   # 暴露该服务的所有端口

3、自定义接口

@RestController
@RequestMapping("/provider")
public class ProviderController [
    @Value("${server.port}")
     private Integer port;
    @RequestMapping("/hello/(id}")
     public string hello(@PathVariable Integer id){
              return "[” + port +"]provider/hello/” + id;
     }
}

4、主启动类

package com.qf.serverprovider ;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client,discovery.EnableDiscoveryClient;
@SpringBootApplication(scanBasePackages = "com.gf")
@EnableDiscoveryClient
public class ServerProviderApplication{
           public static void main(string[] args){
                   SpringApplication.run(ServerproviderApplication.class,args);
           }
}

5、注册中心查看

5、Nacos服务发现

客户端负载均衡

Nacos中提高了客户端操作,可以从NacosService中拉去服务信息,

Autowired
private NacosDiscoveryclient nacosDiscoveryClient;
@test
void test() {
// 1.从Nacos获取服务信息列表
List<serviceInstance> serverilist = nacosDiscoveryclient.getinstances("server1");
// 2.随机返回一个实例,客户端负或均衡
Random random = new Random()
ServiceInstance serviceInstance = serverilist.get(random,nextint(serverilist.size())):
String host = serviceinstance.getHost();
System.out.println(host);
}

     同一个服务在Nacos注册中心可能会存在多个实例,客户端通过服务名称拉取到的实例就会存在多个,此时可以通过客户端负载均衡选择一个实例进行调用。

客户端负载均衡--ribbon

Nacos底层封装了ribbon,所以在nacos中可以使用ribbon的方式进行服务调用

@Autowired
private RestTemplate restTemplate;
@Bean
@LoadBalanced // 负载均衡
public RestTemplate restTemplate(){
return new RestTemplate();
}
@GetMapping("/server2")
public string server2() (
// 1、从Nacos获取服务信息列表
return restTemplate.getForObject("http://server1/server1"String.class);
}

Ribbon负载均衡策略

RandomRule 随机策略 随机选择server

RoundRobinRule 轮询策略 按照顺序选择server (ribbon默认策略)

RetryRule 重试策略 在一个配置时间段内,当选择server不成功,则一直尝试选择一个可用的server

BestAvailableRule 最低并发策略,逐个考察server,如果server断路器打开,则忽略,在选择其中并发链最低的server

AvailabilityFilteringRule 可用过滤策略 过滤掉一直失败并被标记为circuit tripped的server,过滤掉那些高并发链接的server(active connections 超过配置的阈值)

ResponseTimeWeightedRule 响应时间加权重策略 根据server的响应时间重新分配权重,响应时间越长,权重越低,被选择的概率也就越低。响应时间越短,权重越高,被选中的概率越高,这个策略很贴切,综合了各种因素,比如:网络,磁盘,IO等,都直接影响响应时间

ZoneAvoidanceRule 区域权重策略 综合判断server所在区域的性能,和server的可用性,轮训选择server并且判断一个AWS Zone的运行性能是否可用,剔除不可用的Zone中的所有server

feign调用

1、pom文件

因为feign是SpringCloud中提供的组件,所以最好导入SpringCloud的依赖

<dependencies>
    <!-- openfeign依赖-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
     </dependency>
</dependencies>
<dependencyManagement>
    <!-- SpringCloudAlibaba版本 -->
     <dependencies>
           <dependency>
                 <groupId>com.alibaba.cloud</groupId>
                 <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                 <version>2.1.0.RELEASE</version>
                 <type>pom</type>
                 <scope>import</scope>
            </dependency>
            <!-- SpringCloud 依赖-->
           <dependency>
               <groupId>org.springframework.cloud</groupId>
               <artifactId>spring-cloud-dependencies</artifactId>
               <version>Hoxton.SR4</version>
               <type>pom</type>
               <scope>import</scope>
            </dependency>
      </dependencies>

2、定义feign接口

@FeignClient(value = "provider-1")
public interface HelloService {
      @RequestMapping("/hello")
      public string hello();
}

3、开启feign包扫描

@EnableDiscoveryClient
@SpringBootApplication(scanBasePackages = "com.qf")
@EnableFeignClients(basePackages = "com.qf.feign")
public class SpringcloudAlibaba01Server1Application {
         public static void main(string[] args) {
                SpringApplication.run(SpringcloudAlibaba01Server1Application.class, args)
         }
}

Feign调用传递参数

注意事项

  • 如果你传递的参数,比较复杂时,默认采用POST的请求方式。
  • 传递单个参数时,推荐使用@pathVariable,如果传递得单个参数比较多,这里也可以采用@RequestParam,不要省略value属性
  • 传递对象参数时,统一采用json的方式,添加@RequestBody
  • Client接口必须采用@RequestMapping

feign接口的调用

@FeignClient(value = "PROVIDER")
@RequestMapping(value = "/provider")
public interface IProviderservice f
      @RequestMapping(value ="/hel1o")
       public string hello();
       @RequestMapping(value "/getuserById/{}id}") // 这里必须要写属性名称,它不像springmvc那样会自动的把形参作为参数值
       public string getuserByid(@Pathvariable("id") Integer id);
       @RequestMapping(value = "/login") // 这里须要写属性名称,它不想springrvc那祥会自动的把形参作为参数值
        public String login(@RequestParam("username") String username, @RequestParam("password") String password);
        // fein不支持直接传递对象,可以通过这样方式转成son然后传递给服务提供者,服务提供者收到的ison字符申
        // feign[对象]--》对象转成json--》provider[对象]
        @RequestMapping(value = "/adduserFrom"consumes = "application/json")
        public string adduserFrom(RequestBody User user);
        @RequestMapping(value = /adduserJsoN")
        public string adduserjsoN(aRequestbody User user);
}

Feign日志调用

Feign提供了日志打印功能,我们在项目中可以通过配置来调整日志级别,从而了解Feign中http请求的细节,也就是说feign提供的日志功能可以对接口的调用情况进行监控和输出。

日志级别:

NONE:默认的,不显示任何日志

BASIC:仅记录请求方法,URL、响应状态码以及之行时间

HEADERS:除了BASIC中定义的信息以外,还有请求和响应的头信息

FULL:除了HEADERS中定义的信息之外,还有请求和响应的正文以及元数据

01-USER-V2是服务名称,代表调用该服务日志级别是full,这里还可以换成default代表市全局的配置。

feign:
   client:
       config:01-USER-V2:  # default
           loggerLevel: full
logging: 
   level:
      com.ts: debug

Feign超时时间

feign调用服务设置超时时间,超过指定时间未响应就会抛出异常。如果开启了hystrix这样配置是无效的,需要配置Hystrix中的超时时间。

feign:
   client:
      config:
        01-USER-V2:
           loggerLevel: full
           connectTimeout: 3088
           readTimeout: 3088
# 或者这样设置
ribbon:
   ReadTimeout: 38           #负载均衡超时时间,默认值5000
   ConnectTimeout: 3000  #ribbon请求连接的超时时间,默认值2000

Feign负载均衡--权重

1、在注册中心设置权重

2、自定义负载均衡规则

import  com.alibaba.cloud.nacos,NacosDiscoveryProperties;
import  com.alibabacloud.nacos.ribbon,Nacosserver;
import  com.alibaba.nacos.api.exception.NacosException;
import  com.alibaba.nacos.api.naming.pojo.Instance;
import  com.netflix.client.config.Iclientconfig;
import  com.netflix.loadbalancer.AbstractLoadBalancerRule;
import  com.netflix.loadbalancer.DynamicserverListLoadBalancer;
import  com.netflix.loadbalancer.server;
import  org.springframework.beans.factory.annotation.Autowired;
public class NacosweightRandomV2Rule extends AbstractLoadBalancerRule{
      @Autowired
       private NacosDiscoveryProperties discoveryProperties;
      @override
       public server choose(object key) {
                DynamicServerlistLoadBalancer loadBalancer = (DynamicserverlistloadBalancer) getloadBalancer();
                String name = loadBalancer .getName();
                try{
                        Instance instance = discoveryProperties.namingserviceInstance().selectoneHealthyInstance(name);
                        System.out.println("选中的instance = "+instance);
                        /*
                          * instance转server的逻辑遂考自:
                          *org.springframework.cloud.alibaba,nacos.ribbon.NacosServerList.instancesToserverList
                          */
                         return new Nacosserver(instance);
                 } catch (NacosException e) {
                         System.out.println("发生异常:"+e);
                         return null;
                 }
       }
       @override 
        public void initwithNiwsConfig(IClientconfig iclientConfig) {
        }
}

3、使用最定义负载均衡规则

@Bean
public IRule rule(){
       return new NacosweightRandomV2Rule();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/333158.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

高级RAG(八): 自动合并检索(Auto-merging Retrieval)

自动合并检索(Auto-merging Retrieval)是LlamaIndex的另外一种高级RAG技术&#xff0c;它有点类似与我们之间介绍的从小到大的检索&#xff0c;不过自动合并检索要比“从小到大的检索”稍微复杂一些&#xff0c;它首先将文档按一定的层次结构进行切割&#xff0c;然后在检索的时…

Docker 安装 MongoDb4

Docker 安装mongoDb 获取mongodb安装问题汇总参考 获取mongodb 注意&#xff1a; WARNING: MongoDB 5.0 requires a CPU with AVX support, and your current system does not appear to have that! **hub官网&#xff08;需要梯子&#xff09;&#xff1a;**https://hub.dock…

医生都是越老越吃香,为啥程序员却不是?

知乎上有个问题&#xff1a;明明是工作经验越久越吃香&#xff0c;为什么程序员却不是&#xff1f; 仔细一想&#xff0c;好像确实是这样啊。 你们看&#xff0c;大家去医院挂号的时候&#xff0c;都喜欢挂年纪大一点的医生&#xff0c;因为年纪大的经验更丰富。 我们装修选设…

常见问答解析:人工智能在智能时代的潜力与挑战

在智能时代&#xff0c;人工智能&#xff08;AI&#xff09;被视为推动社会和科技进步的关键引擎。让我们通过问答的形式&#xff0c;深入探讨人工智能的潜力与面临的挑战。 问&#xff1a;人工智能在当前社会中扮演什么角色&#xff1f; 答&#xff1a;人工智能已成为现代科技…

Java-NIO篇章(4)——Selector选择器详解

Selector介绍 选择器&#xff08;Selector&#xff09;是什么呢&#xff1f;选择器和通道的关系又是什么&#xff1f;这里详细说明&#xff0c;假设不用选择器&#xff0c;那么一个客户端请求数据传输那就需要建立一个连接&#xff0c;为了避免线程阻塞&#xff0c;那么每个客…

一文说明白 MySQL 的 ACID 和 几种日志的关系

1、简介 我们对于MySQL 很熟悉&#xff0c;关于其特性都有一定的了解&#xff0c;但是关于一些具体的实现原理&#xff0c;有的小伙伴可能不太熟悉&#xff0c;而且这部分知识在我们互联网大厂面试中是经常涉及的&#xff0c;因此&#xff0c;本文将带你深入底层&#xff0c;顺…

实验笔记之——基于TUM-RGBD数据集的SplaTAM测试

之前博客对SplaTAM进行了配置&#xff0c;并对其源码进行解读。 学习笔记之——3D Gaussian SLAM&#xff0c;SplaTAM配置&#xff08;Linux&#xff09;与源码解读-CSDN博客SplaTAM全称是《SplaTAM: Splat, Track & Map 3D Gaussians for Dense RGB-D SLAM》&#xff0c;…

c JPEG 1D DCT

步骤&#xff1a; 1. 对yuv 88 数据 8行分别1D DCT 2, 用8行 1D DCT 得到的数据生成中间88 块 Zj 3,对Zj 的8列再 1D DCT 后生成8列,用这8列组合成8*8的2D DCT 系数 准备用此1D DCT程序代替以前写的2D DCT,看能减少多少编码时间。 看网上文章&#xff0c;ffmpeg用…

【AI预测】破晓未来教育市场:如何精准定位、精选师资并启动高潜力培训项目

在当前全球化和技术快速迭代的背景下&#xff0c;各行业正面临巨大的人才缺口和新的发展机遇。 全球化浪潮&#xff0c;各行业如同搭乘上了一列高速列车&#xff0c;不断深入探索并广泛应用AI技术以提升产业效率、创新服务模式。在智能制造领域&#xff0c;工业4.0时代犹如给…

【Java 设计模式】结构型之适配器模式

文章目录 1. 定义2. 应用场景3. 代码实现结语 适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;用于将一个类的接口转换成客户端期望的另一个接口。这种模式使得原本由于接口不兼容而不能一起工作的类可以一起工作。在本文中&#xff0c;我…

骨传导蓝牙耳机怎么使用?使用骨传导耳机对人体有没有伤害?

骨传导蓝牙耳机的使用方法和传统的入耳式蓝牙耳机使用方法相差无几&#xff0c;都是通过蓝牙来进行连接使用&#xff0c;但骨传导耳机会自带内存&#xff0c;所以在此前提上可以存储音乐独立使用&#xff0c;比传统的入耳式蓝牙耳机使用更方便一些。 那么使用骨传导耳机会不会对…

[一]ffmpeg音视频解码

[一]ffmpeg音视频解码 一.编译ffmpeg1.安装vmware虚拟机2.vmware虚拟机安装linux操作系统3.安装ftp和fshell软件4.在Ubuntu&#xff08;Linux&#xff09;中编译Android平台的FFmpeg&#xff08; arm和x86 &#xff09;5.解压FFmpeg6.Android编译脚本&#xff08;1&#xff09;…

Spring Security工作原理(一)

过滤器 Spring Security的Servlet支持是基于Servlet过滤器的&#xff0c;因此首先了解过滤器的一般作用是很有帮助的。下图显示了单个HTTP请求处理程序的典型分层结构。 处理客户端发送的请求时&#xff0c;容器创建一个FilterChain&#xff0c;其中包含Filter实例和Servlet&a…

Rust-泄漏

在C中&#xff0c;如果引用计数智能指针出现了循环引用&#xff0c;就会导致内存泄漏。而Rust中也一样存在引用计数智能指针Rc,那么Rust中是否可能制造出内存泄漏呢? 内存泄漏 首先&#xff0c;我们设计一个Node类型&#xff0c;它里面包含一个指针&#xff0c;可以指向其他…

C++类与对象【友元】

&#x1f308;个人主页&#xff1a;godspeed_lucip &#x1f525; 系列专栏&#xff1a;C从基础到进阶 &#x1f384;1 友元&#x1f951;1.1 全局函数做友元&#x1f951;1.2 类做友元&#x1f951;1.3 成员函数做友元 &#x1f56e;2 总结 &#x1f384;1 友元 生活中你的家…

xml裁剪标注目标并外扩

import glob import xml.etree.ElementTree as ET import cv2 from PIL import Image import os def change_xmlfile(path)

HCIA-H12-811题目解析(11)

1、下列哪个属性不能作为衡量COST的参数&#xff1f; 2、RSTP协议使用P/A机制加快了上游端口转到Forwarding状态的速度&#xff0c;但是却没有出现临时环路的原因是什么&#xff1f; 3、网络管理员在三层交换机上创建了VLAN10&#xff0c;并在该VLAN的虚拟接口下配置了IP地址…

EtherNet/IP协议开发2:在ubuntu测试

下载源码&#xff1a; git clone https://github.com/EIPStackGroup/OpENer编译 首先进入目录 /big/opener/OpENer/bin/posix 执行脚本&#xff1a; lkmaoubuntu:/big/opener/OpENer/bin/posix$ ./setup_posix.sh 执行make lkmaoubuntu:/big/opener/OpENer/bin/posix$ mak…

基于arcgis js api 4.x开发点聚合效果

一、代码 <html> <head><meta charset"utf-8" /><meta name"viewport"content"initial-scale1,maximum-scale1,user-scalableno" /><title>Build a custom layer view using deck.gl | Sample | ArcGIS API fo…

SPEC CPU 2017 quick start

SPEC CPU 2017 quick start 我这里选择在 linux&#xff08;ubuntu22.04.3&#xff09; 上安装 SPEC CPU 2017&#xff0c;gcc、g、gfortran 均使用 sudo apt install xxx 安装&#xff08;其版本为11.4.0&#xff09; 官方的 SPEC CPU 2017 在 Unix Systems 安装示例&#x…