目录

Nacos注册中心简介

背景分析

Nacos概述

构建Nacos服务

准备工作

下载与安装

初始化配置

服务启动与访问

服务注册与调用入门(重点)

业务描述

生产者服务创建及注册

消费者服务发现及调用

小节面试分析

服务负载均衡设计及实现(重点)

入门案例

@LoadBalanced

Ribbon负载均衡策略(了解)

小节面试分析

provider

consumer


Nacos注册中心简介

背景分析

在微服务中,首先需要面对的问题就是如何查找服务(软件即服务),其次,就是如何在不同的服务之间进行通信?如何更好更方便的管理应用中的每一个服务,如何建立各个服务之间联系的纽带,由此注册中心诞生(例如淘宝网卖家提供服务,买家调用服务)。
市面上常用注册中心有Zookeeper(雅虎Apache),Eureka(Netfix),Nacos(Alibaba),Consul(Google),那他们分别都有什么特点,我们如何进行选型呢?我们主要从社区活跃度,稳定性,功能,性能等方面进行考虑即可.本次微服务的学习,我们选择Nacos,它很好的支持了阿里的双11活动,不仅可以做注册中心,还可以作为配置中心,稳定性和性能都很好.

Nacos概述

Nacos(DynamicNaming and Configuration Service)是一个应用于服务注册与发现、配置管理的平台。它孵化于阿里巴巴,成长于十年双十一的洪峰考验,沉淀了简单易用、稳定可靠、性能卓越的核心竞争力。其官网地址如下:

Nacos 快速开始

构建Nacos服务

准备工作

第一:确保你电脑已配置JAVA_HOME环境变量(Nacos启动时需要),例如:

第二:确保你的MySQL版本为5.7以上(MariaDB10.5以上),例如

下载与安装

第一步:Nacos下载,可在浏览器直接输入如下地址:

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

第二步:选择对应版本,直接下载,如图所示:

第三步:解压Nacos(最好不要解压到中文目录下),其目录结构如下

初始化配置

第一步:登陆mysql,执行老师发给同学们的sql脚本。例如,我们可以使用mysql自带客户端,在命令行首先登录mysql,然后执行如下指令:

source d:/nacos-mysql.sql 

执行成功以后,会创建一个nacos_config数据库,打开数据库会看到一些表,例如;

说明:在执行此文件时,要求mysql的版本大于5.7版本(MariaDB最好10.5.11),否则会出现如下错误:

第二步:打开/conf/application.properties里打开默认配置,并基于你当前环境配置要连接的数据库,连接数据库时使用的用户名和密码(假如前面有"#"要将其去掉):

### If use MySQL as datasource:
spring.datasource.platform=mysql### Count of DB:
db.num=1### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=root

服务启动与访问

第一步:启动Nacos服务。

Linux/Unix/Mac启动命令(standalone代表着单机模式运行,非集群模式):

./startup.sh -m standalone

Windows启动命令(standalone代表着单机模式运行,非集群模式):

startup.cmd -m standalone

说明:
1)执行执行令时要么配置环境变量,要么直接在nacos/bin目录下去执行.
2)nacos启动时需要本地环境变量中配置了JAVA_HOME(对应jdk的安装目录),
3)一定要确保你连接的数据库(nacos_config)是存在的.
4)假如所有的配置都正确,还连不上,检查一下你有几个数据库(mysql,…)

第二步:访问Nacos服务。

打开浏览器,输入http://localhost:8848/nacos地址,出现如下登陆页面:

其中,默认账号密码为nacos/nacos.

服务注册与调用入门(重点)

业务描述

创建两个项目Module分别为服务提供者和服务消费者,两者都要注册到NacosServer中(这个server本质上就是一个web服务,端口默认为8848),然后服务提供者可以为服务消费者提供远端调用服务(例如支付服务为服务提供方,订单服务为服务消费方),如图所示:

生产者服务创建及注册

第一步:创建服务提供者工程(module名为sca-provider),继承parent工程(01-sca),其pom.xml文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<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"><parent><artifactId>01-sca</artifactId><groupId>com.jt</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>sca-provider</artifactId><dependencies><!--Web服务--><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>
</project>

第二步:创建并修改配置文件application.yml(或者application.properties),实现服务注册,关键代码如下:

server:port: 8081
spring:application:name: sca-providercloud:nacos:discovery:server-addr: localhost:8848

注意:服务名不要使用下划线(“_”),应使用横杠(“-”),这是规则。
第三步:创建启动类,并定义处理请求的控制层对象和方法,关键代码如下:

package com.cy;@SpringBootApplication
public class ProviderApplication {public static void main(String[] args) {SpringApplication.run(ProviderApplication.class, args);}/**定义Controller对象(这个对象在spring mvc中给他的定义是handler),* 基于此对象处理客户端的请求*/@RestControllerpublic class ProviderController{//@Value默认读取项目配置文件中配置的内容//8080为没有读到server.port的值时,给定的默认值@Value("${server.port:8080}")private String server;//http://localhost:8081/provider/echo/tedu@GetMapping("/provider/echo/{msg}")public String doRestEcho1(@PathVariable String msg){return server+" say hello "+msg;}}}

第四步:启动启动类,然后刷先nacos服务,检测是否服务注册成功,如图所示:

第五步:打开浏览器,输入http://localhost:8081/provider/echo/msa,然后进行访问。

消费者服务发现及调用

第一步:创建服务消费者(module名为sca-consumer),继承parent工程(01-sca),其pom.xml文件内容如下

<?xml version="1.0" encoding="UTF-8"?>
<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"><parent><artifactId>01-sca</artifactId><groupId>com.jt</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>sca-consumer</artifactId><dependencies><!--Web服务--><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>
</project>

第二步:修改配置文件application.yml,关键代码如下:

server:port: 8090
spring:application:name: sca-consumercloud:nacos:discovery:server-addr: localhost:8848 #从哪里去查找服务

第三步:创建启动类并实现服务消费,关键代码如下:

package com.cy;
@SpringBootApplication
public class ConsumerApplication {public static void main(String[] args) {SpringApplication.run(ConsumerApplication.class,args);}@Beanpublic RestTemplate restTemplate(){return new RestTemplate();}@RestControllerpublic class ConsumerController{@Value("${spring.application.name}")private String appName;@Autowiredprivate RestTemplate restTemplate;@GetMapping("/consumer/doRestEcho1")public String doRestEcho01(){String url = "http://localhost:8081/provider/echo/"+appName;System.out.println("request url:"+url);return restTemplate.getForObject(url, String.class);}}
}

第五步:启动消费者服务,并在浏览器输入http://localhost:8090/consumer/doRestEcho1地址进行访问,假如访问成功会出现,如图所示效果:

小节面试分析

服务负载均衡设计及实现(重点)

入门案例

一个服务实例可以处理请求是有限的,假如服务实例的并发访问比较大,我们会启动多个服务实例,让这些服务实例采用一定策略均衡(轮询,权重,随机,hash等)的处理并发请求,在Nacos中服务的负载均衡(Nacos客户端负载均衡)是如何应用的?

第一步:修改ConsumerController类,注入LoadBalancerClient对象,并添加doRestEcho2方法,然后进行服务访问.

@Autowiredprivate LoadBalancerClient loadBalancerClient;@GetMapping("/consumer/doRestEcho02")public String doRestEcho02(){ServiceInstance serviceInstance = loadBalancerClient.choose("sca-provider");String url = String.format("http://%s:%s/provider/echo/%s",serviceInstance.getHost(),serviceInstance.getPort(),appName);System.out.println("request url:"+url);return restTemplate.getForObject(url, String.class);}}

第二步:打开Idea服务启动配置,如图所示:

第三步:修改并发运行选项(假如没有找到这个选项我们需要通过搜索引擎基于组合查询的方法,去找到对应的解决方案,例如搜索 idea allow parallel run),如图所示:

第四步:修改sca-provider的配置文件端口,分别以8081,8082端口方式进行启动。

server:port: 8081
spring:application:name: sca-providercloud:nacos:server-addr: localhost:8848

启动成功以后,访问nacos的服务列表,检测服务是否成功注册,如图所示:

第四步:启动sca-consumer项目模块,打开浏览器,输入如下网址进行反复服务访问:

http://localhost:8090/consumer/doRestEcho02

然后会发现sca-provider的两个服务都可以处理sca-consumer的请求。

这里多个实例并发提供服务的方式为负载均衡,这里的负载均衡实现默认是因为Nacos集成了Ribbon来实现的,Ribbon配合RestTemplate,可以非常容易的实现服务之间的访问。Ribbon是Spring Cloud核心组件之一,它提供的最重要的功能就是客户端的负载均衡(客户端可以采用一定算法,例如轮询访问,访问服务端实例信息),这个功能可以让我们轻松地将面向服务的REST模版请求自动转换成客户端负载均衡方式的服务调用。

@LoadBalanced

当使用RestTemplate进行远程服务调用时,假如需要负载均衡,可以在RestTemplate对象构建时,使用@LoadBalanced对构建RestTemplate的方法进行修饰,例如在ConsumerApplication中构建RestTemplate对象:

@Bean
@LoadBalanced
public RestTemplate loadBalancedRestTemplate(){return new RestTemplate();
}

在需要RestTemplate实现负载均衡调用的地方进行依赖注入.例如在ConsumerController类中添加loadBalancedRestTemplate属性

@Autowired
private RestTemplate loadBalancedRestTemplate;

接下来,可以在对应的服务端调用方的方法内,基于RestTemplate借助服务名进行服务调用, 例如:

@GetMapping("/consumer/doRestEcho3")
public String doRestEcho03(){String url=String.format("http://%s/provider/echo/%s","sca-provider",appName);//向服务提供方发起http请求,获取响应数据return loadBalancedRestTemplate.getForObject(url,//要请求的服务的地址String.class);//String.class为请求服务的响应结果类型
}

RestTemplate在发送请求的时候会被LoadBalancerInterceptor拦截,它的作用就是用于RestTemplate的负载均衡,LoadBalancerInterceptor将负载均衡的核心逻辑交给了loadBalancer,核心代码如下所示(了解):

public ClientHttpResponse intercept(final HttpRequest request, final byte[] body, final ClientHttpRequestExecution execution) throws IOException {final URI originalUri = request.getURI();String serviceName = originalUri.getHost();return this.loadBalancer.execute(serviceName, requestFactory.createRequest(request, body, execution));
}

@LoadBalanced注解是属于Spring,而不是Ribbon的,Spring在初始化容器的时候,如果检测到Bean被@LoadBalanced注解,Spring会为其设置LoadBalancerInterceptor的拦截器。

Ribbon负载均衡策略(了解)

基于Ribbon方式的负载均衡,Netflix默认提供了七种负载均衡策略,对于SpringCloud Alibaba解决方案中又提供了NacosRule策略,默认的负载均衡策略是轮训策略。如图所示:

当系统提供的负载均衡策略不能满足我们需求时,我们还可以基于IRule接口自己定义策略.

小节面试分析

provider


@SpringBootApplicationpublic class ProviderApplication {public static void main(String[] args) {SpringApplication.run(ProviderApplication.class,args);}@RestControllerpublic class ProviderController{//@value用于读取application.yml中的配置//要读取的配置需要写在${}这个表达式中//${}表达式中":"后的内容@Value("${server.port:8080}")private String server;/*** 基于此方法实现一个字符串的回显* echo:回显的意思* rest:一种软件架构编码风格,可以基于这种风格定义url* 访问:http://localhost:8081/provider/echo/nacos* */@GetMapping("/provider/echo/{msg}")public String doRestEcho1(@PathVariable("msg") String msg){return server+"say hello "+ msg;}}
}

consumer

/*** 消费方对象的启动类* 业务描述:* 当客户端(浏览器,手机app)向服务消费方发起请求时,* 服务消费方调用提供方的api,进而获取服务提供方的数据* 例如:*我们访问一个订单模块数据(例如我的订单),订单模块中还要呈现商品信息。**/
@SpringBootApplication
public class ConsumerApplication {public static void main(String[] args) {SpringApplication.run(ConsumerApplication.class,args);}/*** 构建RestTemplate对象,并将此对象交给spring管理,* 后续我们会通过此对象进行远程服务调用* @return* */@Beanpublic RestTemplate restTemplate(){return new RestTemplate();}@Bean@LoadBalancedpublic RestTemplate loadBalancerRestTemplate(){return  new RestTemplate();}@RestControllerpublic class ConsumerController{/*** 负载均衡客户端对象* */@Autowiredprivate LoadBalancerClient loadBalancerClient;@Autowiredprivate RestTemplate restTemplate;@Autowiredprivate RestTemplate loadBalancerRestTemplate;@Value("${spring.application.name}")private String appName;//http://ip:port/consumer/doRestEcho1@GetMapping("/consumer/doRestEcho1")public String doRestEcho1(){System.out.println("==doRestEcho1==");//调用服务提供方API(http://ip:port/path)//1.定义要调用的APIString url = "http://localhost:8081/provider/echo/"+appName;//2.谁去访问这个API restTemplate();return restTemplate.getForObject(url,String.class);}//封装//1)狭义:属性私有化,能公开则公开//2)广义:一个系统由哪些服务构成,一个服务由哪些模块构成,一个模块由哪些对象构成,一个对象由哪些属性构成@GetMapping("/consumer/doRestEcho2")public String doRestEcho2(){//1.从注册中心获取服务实例ServiceInstance instance =loadBalancerClient.choose("sca-provider");//2.基于restTemplate进行服务实例调用String ip = instance.getHost(); // ipint port = instance.getPort();String url = "http://"+ip+":"+port+"/provider/echo/"+appName;//String url = String.format("http://%s:%s/provider/echo/%s",ip,port,appName);return restTemplate.getForObject(url,String.class);}@GetMapping("/consumer/doRestEcho3")public String doRestEcho3(){//定义urlString url = String.format("http://sca-provider/provider/echo/%s",appName);//服务调用return loadBalancerRestTemplate.getForObject(url,String.class);}}}
//将一个bean交给spring管理时,假如这个bean不在同包或子包中,
//可以使用 ① @import(Default.class)
//②
// @Bean
// public Default default(){
//       return new default();
// }

微服务架构02-nacos注册中心相关推荐

  1. 微服务架构: 基于nacos注册中心的Zuul网关实现

    一. 为什么需要网关 在微服务架构设计中,通常会有若干个服务提供者.例如一个券商系统,会有用户系统.开户系统.资讯系统.交易系统等多个服务,而每个服务数量会最着集群部署会变得越来越庞大和复杂.客户端在 ...

  2. 微服务 注册中心的作用_微服务架构Dubbo之注册中心(Zookeeper)

    注册中心简介 在微服务架构中,注册中心是核心的基础服务之一.在微服务架构流行之前,注册中心就已经开始出现在分布式架构的系统中.Dubbo是一个在国内比较流行的分布式框架,被大量的中小型互联网公司所采用 ...

  3. 【Spring Cloud Alibaba】(一)微服务介绍 及 Nacos注册中心实战

    文章目录 前言 I.微服务与Spring Cloud II.Nacos 注册中心 III.Spring Cloud Alibaba Nacos 实战 1.新建父工程 2.新建demo-a 服务 3.新 ...

  4. 微服务架构之「 配置中心 」

    点击上方"方志朋",选择"置顶公众号" 技术文章第一时间送达! 在微服务架构的系列文章中,前面已经通过文章<微服务架构之「服务网关 」>介绍过了在微 ...

  5. Spring Cloud构建微服务架构:分布式配置中心【Dalston版】

    Spring Cloud Config是Spring Cloud团队创建的一个全新项目,用来为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持,它分为服务端与客户端两个部分.其中服务端也称为 ...

  6. spring.profiles.active配置了没生效_微服务架构之「 配置中心 」

    在微服务架构的系列文章中,前面已经通过文章<微服务架构之「服务网关 」>介绍过了在微服务中服务网关的原理和应用,今天这篇文章我们继续来聊一聊微服务中另外一个重要模块:「 配置中心 」.后面 ...

  7. 微服务系列之ZooKeeper注册中心和Nacos注册中心Nacos和Zookeeper对比

    一.ZooKeeper注册中心 Zookeeper 是 Apache Hadoop 的子项目,是一个树型的目录服务,支持变更推送,适合作为 Dubbo 服务的注册中心,工业强度较高,可用于生产环境,推 ...

  8. nacos linux启动_微服务系列之Nacos配置中心之一:Nacos介绍与安装

    一.Nacos 介绍 Nacos 是 Alibaba 公司推出的开源工具,用于实现分布式系统的服务发现与配置管理.英文全称 Dynamic Naming and Configuration Servi ...

  9. Linux启动nacos成功日志_微服务系列之Nacos配置中心

    Nacos 介绍 Nacos 是 Alibaba 公司推出的开源工具,用于实现分布式系统的服务发现与配置管理.英文全称 Dynamic Naming and Configuration Service ...

  10. SpringCloud微服务架构,Config 分布式配置中心,Bus 消息总线, Stream 消息驱动,Sleuth+Zipkin 链路追踪

    Config分布式配置中心 Config 概述 概述 • Spring Cloud Config 解决了在分布式场景下多环境配置文件的管理和维护. • 好处: • 集中管理配置文件 • 不同环境不同配 ...

最新文章

  1. SpringMVC项目前台利用ajaxFileUpload传递图片后台接收
  2. CodeForces - 336A Vasily the Bear and Triangle
  3. 怎么在ASP.NET 2.0中使用Membership
  4. 腾讯围棋AI绝艺战胜DeepZenGo又夺一冠
  5. Angular Js对象的拷贝复制
  6. Linux下查看某个进程占用的CPU及内存
  7. 光流.flo文件生成.png图片(可批量)
  8. ref改变样式 vue_我用React和Vue构建了同款应用,对比看看(2020版)
  9. oracle触发器和存储过程的格式
  10. Android系统中SD卡各文件夹名称功能详解
  11. MSDN Windows 10 21H1 64位19043原版系统
  12. 智能颈椎按摩仪的特点和功能
  13. 变色镜片市场需求广大
  14. 百兆宽带是怎么个一百兆?
  15. revit二次开发 材质相关
  16. 2009年度EXIN中国金牌、银牌、铜牌以及常规授权机构
  17. 知道计算机组装,电脑组装不担心被电脑店套路,就要懂得如何查看电脑的硬件配置...
  18. 软件测试100W字!【这可能是最全的总结】
  19. 波特率9600每秒的传输字节_波特率、比特率、通信速度的区别01
  20. AVI解码器,使用OPenCV可以打开中科院步态数据库的AVI文件

热门文章

  1. Log4cpp log4cpp快速使用指南
  2. 一款可查看和验证电子发票、电子合同、电子公文等PDF文档数字签名的 免费 桌面应用。
  3. 领袖人物的16个主要特征
  4. C++primeplusp(p356-386)
  5. 2 01 | 什么是优秀的产品经理?
  6. css3 勾 叉,勾模拟手机菜单 三横杠,左右
  7. java rtti_举例讲解Java的RTTI运行时类型识别机制
  8. 机械革命x6ti拆机教程
  9. deeplabv3+系列之ResNet骨干网络
  10. jit 调试失败,出现以下错误:拒绝访问。jit调试由用户帐户NT AUTHORITY\NETWORK SERVICE 启动...