- 添加依赖
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.hhm</groupId>
<artifactId>nacosServer</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>nacos-provide1</artifactId>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2.1.2.RELEASE</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
查看依赖树,发现nacos-discovery包含了ribbon
-
使用
原理分析:
添加了@LoadBalanced注解后,调用服务时ribbon会通过拦截器根据服务名去注册中心(nacos)拉取服务列表到本机缓存起来,然后ribbon会在相应的策略下进行服务的调用,实现负载均衡;@LoadBalanced来让RestTemplate具备客户端负载功能 -
添加机器不需要重启,nacos会自动感知并添加服务
原理分析:当添加新的一个服务时,会主动注册到服务中心,那服务调用方时如何感知到有新的服务添加进来了呢?原理是:服务的调用方因为集成了ribbon,而ribbon有个定时任务,会定时地去注册中心拉取服务并缓存到本机,所以能进行服务的调用而不需要重新启动nacos(nginx需要重启) -
当服务死掉的时候,nacos是如何感知到服务不可用的并从服务列表移除的呢?
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
这个依赖引入时,在系统启动的时候,会启动一个定时任务,定时地向注册中心发送心跳,但一个服务死掉的时候,无法发送心跳;注册中心(nacos)等到一段时间依然无法接受到心跳时,会认为该服务已经不可用,然后会从服务列表中将该服务信息移除掉;服务调用方通过ribbon的定时器去拉取服务时,就拉取不到死掉的服务,并把最新拉取的服务覆盖上一次拉取到的服务并缓存到本机;这样会导致一个问题的存在:因为服务死掉时,并不是能立刻感知到的,需要等待一段时间,那就是在等待的这段时间,有客户端调用了死掉的服务怎么办?没问题,ribbon会有重试策略,当访问服务一不可用时,通过重试策略访问服务二,以此类推,而不是直接返回失败信息,实现高可用;当然,当所有的机器都坏掉时,肯定会返回错误信息的 -
nacos其实就是一个web服务,对外提供了很多的http请求接口
例如:进行服务注册的时候,服务方调用了nacos提供的/nacos/v1/ns/instance接口,要求服务传递ip,端口号等信息过来,因此在nacos服务列表上能看到对应的信息 -
使用openfeign组件,实现简单的服务调用、
当没有使用该组件时,我们通过以下方式进行服务的调用
这样不符合我们的习惯,我们平时调用server的时候,都是直接service.getMethod()即可,openfeign组件就是为此诞生;
引入依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
在启动类添加注解:@EnableFeignClients
创建接口:
调用:
直接通过provide.get()即可实现远程服务的调用!!!