nacos简明教程

为什么需要nacos?

在微服务架构中,微服务之间经常要相互通信和调用,而且一个服务往往存在多个实例来降低负荷或保证高可用。我们假定A服务要调用B服务,最简单的方式把B服务的地址和端口保存在A服务的配置文件中。然后通过http请求去完成B服务的调用。但是B服务可能有好多个实例,而且可能会随着业务的需求随时的扩展或者停用掉一些实例,这个时候B服务的地址和端口可能会经常发生改变。如果记录在配置文件就多有不便。而且在众多的B服务中,可能有一些服务会出现各种问题坏掉,我们可能还需要写一个心跳检测,看看是不是所有的服务都正常运行,及时地剔除掉那些不能用的服务。如果完备稳定的实现这些功能,是一个不小的工作量。还好凡是有困难的地方总有前人造轮子。而Nacos就是来解决这样问题的轮子。

如图所示,通过简单的配置和注解,所有的微服务都把自己信息登记到Nacos server中去。在需要调用的时候,通过登记到Nacos server的名字就可以完成微服务间的调用。比如有以前通过访问 http://12.3.3.5:8090/service 来访问微服务的,变成了http://provider/service 的方式来访问,把服务与端口地址解耦。

如何使用Nacos

Nacos server的启动

Nacos使用非常的简单。从Nacos官网下载release包,linux\mac下面执行sh startup.sh -m standalone,windows下面执行startup.cmd -m standalone 然后就可以完成Nacosserver的启动。

在微服务中使用Nacos做服务注册和发现

通过maven架包使用Nacos发现服务

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

在配置文件中简单配置

spring:
application:
name: provider #这个很重要,是注册到Nacos中调用的服务的名称
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 #配置Nacos的服务地址

在启动类上增加注解@EnableDiscoveryClient

@SpringBootApplication
@EnableDiscoveryClient
public class ProviderApplication { public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
} }

通过简单的几步就可以完成了把微服务注册到了Nacos Server。怎么样很简单吧。当然Nacos除了做服务注册和发现外,还可以做配置中心,使用方法大同小异。更多丰富的操作参考官方文档 Nacos官方网站

服务的调用

如果要通过http://provider/service的方式去调用微服务,还需要构造http请求,请求回来的结果还要做json解析等等一系列繁杂的工作。而Ribbon就用来解决这个问题的。在springcloud.alibaba的nacos发现服务的Maven包中,已经包含了ribbon.我们通过简单的几行代码,就可以完成微服务的调用。

假定在provider服务中有这么一段代码,我们要调用

//例子来自Nacos官网
@RequestMapping(value = "/echo/{string}",method = RequestMethod.GET)
public String echo(@PathVariable String string)
{
return "Hello Nacos Discover" + string;
}

我们只需要实例化一个RestTemplate

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

然后就可以再想要调用的地方来通过下面的代码来非常简单地调用。

String result = restTemplate.getForObject("http://provider/echo/"+str,String.class);

负载均衡的问题

前面讲到,在微服务环境中常常同一个服务会有N多实例,我们不希望所有的调用都跑到一个实例上去,这个时候就需要用到负载均衡。我们只需要在启动来加上 @LoadBalanced 注解。在配置文件的spring.application.name相同的应用会被认为是同一个微服务,然后转发可以通过ribbon内置的策略路由到不同的provider中去。

如果我们期望有的provider的优先级比别的优先级高一些,可以再provider的配置文件中调节不同的权重。

spring:
cloud:
nacos:
discovery:
weight: 1 #配置权重

使用Feign

通过上面的方法,已经把微服务之间的相互调用变得非常的简单了。但是还不够,Feign可以让调用更加简单。

引用maven包

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

然后我们针对要调用的provider定义一个接口,接口的方法为要调用的方法名,参数和调用参数同名。@FeignClient 注解中name为微服务的名称。复杂一些的方法调用可能需要在接口中配合@RequestMapping指定具体的路由规则,然后就可以通过该接口直接调用微服务方法,是不是更加清晰简单呢?

@FeignClient(name = "provider")
@Service
public interface TestService {
String echo(String serviceName);
}
public class TestController {
private final RestTemplate restTemplate;
@Autowired
private TestService testService; @GetMapping("/echo2/{str}")
public String echo2(@PathVariable String str)
{
return testService.echo(str);
}
}

nacos、ribbon和feign的简明教程的更多相关文章

  1. 小D课堂 - 新版本微服务springcloud+Docker教程_4-06 Feign核心源码解读和服务调用方式ribbon和Feign选择

    笔记 6.Feign核心源码解读和服务调用方式ribbon和Feign选择         简介: 讲解Feign核心源码解读和 服务间的调用方式ribbon.feign选择             ...

  2. ArcGIS Pro 简明教程(4)工具和模型构建器

    ArcGIS Pro 简明教程(4)工具和模型构建器 by 李远祥 工具箱中的工具 ArcGIS Pro 在1.3版本基本上已经继承了ArcMap的所有工具,而且会不断加入一些它自身才有的工具,例如适 ...

  3. ArcGIS Pro 简明教程(3)数据编辑

    ArcGIS Pro 简明教程(3)数据编辑 by 李远祥 数据编辑是GIS中最常用的功能之一,ArcGIS Pro在GIS数据编辑上使用习惯有一定的改变,因此,本章可以重点看看一些编辑工具的使用和使 ...

  4. ArcGIS Pro 简明教程(1)Pro简介

    ArcGIS Pro 简明教程(1)Pro简介 ArcGIS Pro已经发布了相当的一段时间了,截至笔者写这系列文章的时候已经是1.3版本了,已经是相当完善的一个版本,基本上已经完成了原来ArcGIS ...

  5. Spring Boot + Spring Cloud 实现权限管理系统 后端篇(十九):服务消费(Ribbon、Feign)

    技术背景 上一篇教程中,我们利用Consul注册中心,实现了服务的注册和发现功能,这一篇我们来聊聊服务的调用.单体应用中,代码可以直接依赖,在代码中直接调用即可,但在微服务架构是分布式架构,服务都运行 ...

  6. spring cloud 2.x版本 Feign服务发现教程(内含集成Hystrix熔断机制)

    前言 本文采用Spring cloud本文为2.1.8RELEASE,version=Greenwich.SR3 本文基于前两篇文章eureka-server和eureka-client的实现. 参考 ...

  7. SpringCloud-使用熔断器防止服务雪崩-Ribbon和Feign方式(附代码下载)

    场景 SpringCloud-服务注册与实现-Eureka创建服务注册中心(附源码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/deta ...

  8. 2013 duilib入门简明教程 -- 第一个程序 Hello World(3)

    小伙伴们有点迫不及待了么,来看一看Hello World吧: 新建一个空的win32项目,新建一个main.cpp文件,将以下代码复制进去: #include <windows.h> #i ...

  9. 2013 duilib入门简明教程 -- 部分bug (11)

     一.WindowImplBase的bug     在第8个教程[2013 duilib入门简明教程 -- 完整的自绘标题栏(8)]中,可以发现窗口最大化之后有两个问题,     1.最大化按钮的样式 ...

随机推荐

  1. 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU硬件那些事(2.3)- 串行NOR Flash下载算法(J-Link工具篇)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是J-Link工具下i.MXRT的串行NOR Flash下载算法设计. 在i.MXRT硬件那些事系列之<在串行NOR Flash X ...

  2. python中np.arrange用法

    转载:https://www.cnblogs.com/ghllfl/p/8487692.html np.arange()经常用,其用法总结如下: np.arange(0,60,2) 生成从0到60的步 ...

  3. 刷LeetCode的简易姿势

    近期抽空刷了刷LeetCode,算是补补课. 由于不是很习惯直接在网页上Coding&Debug,所以还是在本地环境下进行编码调试,觉得基本OK后再在网页上提交. 主要采用Python3进行提 ...

  4. fastadmin toggle switch 开关 ids 值为空的解决办法

    这个是低版本的一个bug 官方已给出说明,由于项目原因未选择升级版本 现在讲解决办法 1.在自定义开关的字段假如table:table 2.修改require-table.js 在536行左右的 to ...

  5. day55 Pyhton 前端Jquery07

    昨日回顾: 表单,点击submit提交以后,服务端受到信息 import socket import pymysql from urllib.parse import unquote def run( ...

  6. 洛谷 CF1012C Hills(动态规划)

    题目大意: 有几座山,如果一座山左右两边的山比它矮,那么可以在这个山上建房子,你有一台挖掘机,每天可以挖一座山一米,问你需要花多少代价可以分别盖1.2.3--座房子.(给出山的数量,以及每座山的高度) ...

  7. Linux系统编程—信号捕捉

    前面我们学习了信号产生的几种方式,而对于信号的处理有如下几种方式: 默认处理方式: 忽略: 捕捉. 信号的捕捉,说白了就是抓到一个信号后,执行我们指定的函数,或者执行我们指定的动作.下面详细介绍两个信 ...

  8. Python自动化准备工作(pycharm安装)

    一.安装Python 1.下载python-3.7.0-amd64.exe后双击 2.勾选Add Python3.7 to PATH可不用配置环境变量 3.点击下一步,可以按默认路径,也可以自己选择路 ...

  9. beego和gin对比

    一.对mvc的支持 beego支持完整的mvc M:Model,beego orm,把数据库数据变成object 特性 支持go的所有类型存储 更简洁的curd风格 完整实现了健壮的ORM 支持的数据 ...

  10. HTML轮播(2)

    前言 现在在完成轮播的框架上进行扩展更多的功能,上下切换图片,以及添加动画滚动更加平滑过渡 CSS <style> #LB { width: 100%; height: 948px; ov ...