阿里云
为了无法计算的价值
打开APP
阿里云APP内打开
学习中心> 微服务实战-服务注册与发现 - Nacos Discovery> 正文

微服务实战-服务注册与发现 - Nacos Discovery

1课时 |
6466人已学 |
免费
课程介绍

Nacos是阿里巴巴的一个开源项目,是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台,特性如下:

  • Nacos致力于帮助开发者发现、配置和管理微服务;
  • Nacos提供了一组简单易用的特性集,帮助开发者快速实现动态服务发现、服务配置、服务元数据及流量管理;
  • Nacos帮助开发者更敏捷和容易地构建、交付和管理微服务平台;
  • Nacos是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。

服务注册与发现

 

内容介绍:

一、服务注册与发现的基本概念

二、本地开发环境中开发应用环境的过程

三、如何部署到阿里云EDAS

 

 

一、服务注册与发现的基本概念

1.服务注册

服务实例将自身服务信息注册到注册中心,包括服务所在IP和Port、服务版本以及访问协议等

(我们所熟悉的DNS就是一个很经典的服务注册,那么在微服务的环境下,服务的实例除了要注册自己所在的IP地址和端口号以外,还要把其他的一些信息,比如说自己的版本号,所支持的通讯协议等等这些信息,也把它放到第三方的注册中心当中去,可以把它想象成它是一个增强版的DNS)

 

2.服务发现

应用实例通过注册中心,获取到注册到其中的服务实例的信息,通过这些信息去请求他们提供的服务。

 

已经有了dns为什么还需要服务注册和发现的组件?

由于自动扩缩、故障与升级,整组服务实力会动态变更。

举例:假设一个服务有十个实例,在客户端无法发现对应实例时,需要更强大有效的服务注册中心来管理和发现所需要的服务。

服务的注册和发现是微服务治理中一个非常重要、非常核心的观念和功能。

 

 

二、本地开发环境中开发应用环境的过程

1.启动Nacos

为了搭建在本地的开发环境,我们需要下载并安装NACOS,既可以通过下载源代码来编译它,也可以下载编译好以后的压缩包。

 

NACOS官网:https://nacos.io/zh-cn/docs/quick-start.html大家可以去看一下具体的文档。

  下载以后的启动命令 sh  startup.sh-m standalone(启动命令standalone代表着单机模式运行,非集群模式)

启动nacos

 

启动好的NACOS一方面可以监听api,一方面也可以有一个控制台。

NACOS控制台如下

NACOS分成两部分,一个是它的配置项管理,另一个就是他的服务列表。

 

本地开发

Demo源码:https//github.com/szihai/Nacos-discovery-demo

服务端 @EnableDiscoveryClient

下面看一下具体的代码本  

/**

*@author <a href= "mailto:fangjian0423@gmail.com">Jim</ a>

*/

@SpringBootApplication

@EnabLeDiscoveryClient

public class ProviderApplication {

public static void main(string[] args) { SpringApplication.run(Provider)

 

@RestController

class Echocontroller {

@RequestMapping (value = "/echo/{string}", method  = RequestMethod.GET)  

public String eche(@PathVariable String string) {return string;}}

这两个代码其实都是spring boot应用程序,它的主要目的就是告诉大家如何使用Nacos来实现服务注册和发现,现在看到的是服务端的代码是它的源码,就是最基本的部分。

 

首先看一下它实现的功能,它是实现一个restAPI,因为这里有一个rest controller annotation,它的路径的是echo,后面跟了一个变量string,它做的就是把string返回回去(你告诉它要返回什么变量,它会直接把这个string给返回回去)

 

另一个要讲的是enable discovery climb,其实这个跟你用其他的注册中心的是一个annotation,但是用了这个annotation以后,它就会让注册中心来扫,可以找到这个应用,在我们使用这个Nacos的时候,Nacos就会来扫这个应用程序,然后把它加到注册中心当中去,这是注册的过程.

 

2.服务端

服务端 application.properties

在这个配置文件中,我们做了这几件事,第一定义了服务的名字叫做service -provider,

第二定义了稍后要发布的端口是8081,第三把Nacos的服务的地址和端口号告诉我们自己的应用程序。最后一个是稍后要讲的endpoint,它是要暴露这些n point。

spring.application.name=service-provider

server.port-8081

spring.cloud.nacos.discovery.servec-addr=127.0.0.1:8848  

management.endpoints.web.exposure.include=*

让我们来看一下服务端的程序运行起来是什么样的情况?我们可以到Nacos控制台来看一下。

用户是nacos,密码也是nacos。可以看到现在在这个服务下有一个实例,看一下具体的情况,这个服务已经注册上去了。

 

3.Actuator端点

 监控和管理服务

 /info, /health

 http://localhost:8081/actuator/nacos-discovery

这个概念是spring boot的一个概念,它是用来监测你的应用程序,端点的路径是actuator后面跟着你要查的具体的api是什么。

 

Spring Boot它有自己实现的一些api。

现在要讲的是Nacos-discovered的端点,locahost:l8081是应用他自己的IP和端口号。

其他的都srings boot所提供的,要看的就是nacos-discovery这个端点是实现了,在这里就有关于端点基本的情况,可以看到nacos服务器的地址,自己的服务发布到这个服务的一些信息。

 

 

4.消费端

 Pom

Application.properties

首先看一下pom文件,在这个pom文件当中,和服务端一样也是有依赖的管理,也指定了相应的版本号。在这个依赖当中,也加了alibaba-nacos- discoverey -starter。

但是这个和服务方不一样,又引进了一个openfeign,openfeign不是一个netflix oss组件,就是他不是springup自带的,要手动把他加进来。

Spring.applcation.name=service-consumer

server.port=18082

spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

这个就是application.practice,消费端的端口是18082,和刚刚不一样,刚刚是8081,这个名字叫做service consumer(只是这个应用的名字而已),同样这个nacos的服务器的地址和端口,是本地的8848端口。

 

5.消费端的代码

REST Template

Feign client

消费端这里用了两种实现方式,一个是rest template,一个是feign client。我们要讲的重点是nacos两种方式都支持。首先看rest template,用rest template之前,先要加annotation也就是LoadBalanced。

 

REST Template定义以后在testcontroller就定义了另外一个restCPI,就是restTemplate他会去调用service-provider的echo的API。把这个返回的结果在作为这个rest API的返回值。

 

feign client和REST Template有点不同,feign client是二合一,它是rest加上load balance 它两个都包括,所以你调用的时候,就是先定义一个interface,在feign client已经表述了我要用的服务是service -provider,那么在实现它的rest API的时候,就直接表述API的名字是echo-feign,后面跟着一个它会找echo-Service的echo服务,为什么我们在这个已经是已经是消费端的地方还要再做一个restAPI,是因为我们作为用户来讲,可以测试,否则我们无法知道是否调成。

 

@LoadBalanced

@Bean

Public RestTemplate restTemplate() {return new RestTemplate();}

public static void main(String[] args) {SpringApplication.run(Consumer)}

@FeignClient(name = "service-provider")

interface Echoservice {

@RequestMapping(value = "/echo/{str}", method = RequestMethod.GET)  

String echo(@PathVariable("str”) String str);

 

@RestController

class TestContcoller {

@Autovired

private RestTemplate restTemplate;

@Autowired

private EchoService echoSecvice;

@RequestMapping (value = "/echo-rest/{str}", method = RequestMethod.GET  public String rest(@PathVariable String str){

returnrestTemplate.getForobject(url: "http://service-provider/echo  String. class);

@RequestMapping(value = "/echo-feign/{str}", method = RequestMethod.GET 

public String feign(@PathVariable String str){  return echoService.echo

6.Ribbon的拓展

在运行客户端程序之前,在多讲一下关于load balance的问题,nextlinks它提供了一个内置的load balance叫做ribbon,ribbon是和rest template在一起工作的,为了让这个可以工作nacos也拓展了其中ribbon当中的一个interface叫做service list。就是说ribbon作为一个负载均衡的工具,它也可以对nacos的服务进行一个负载均衡的操作,所以这就是ribbon的作用,然后nacos对他进行了扩展。

 

运行起来以后,可以做个实验,我们暴露了两个restAPI一个叫echo-rest一个叫echo-feign,先来看一下echo-feign,给它加一个东西叫做test。然后它就返回test,所以这个路径就是从Brother到echo-feign,然后echo-feign去调刚刚他在那里定义的service-provider的service。

 

 

接下来看echo-rest,它返回的就是rest,echo-rest刚刚讲的它是用rest template加ribbon去调service- provider,这就是在本地开发nacos应用的情况。

 

 

三、如何部署到阿里云EDAS

1.创建ECS

下面要转战到阿里云,如何把这些应用部署到阿里云上,用什么样的服务,在做这个之前请大家用package把自己在本地的服务端和客户端的两个应用打包成JAR,稍后上传时会比较方便。

在向阿里云实操之前先介绍一下什么是企业级分布式应用服务EDAS企业级分布式应用服务EDAS(Enterprise Distibuted Application Service)是一个应用托管和微服务管理的PaaS平台,提供应用开发、部署、监控、运维等全栈式解决方案,同时支持Dubbo、SpringCloud等微服务运行环境,助力您的各类应用轻松上云。

 

也就是说,把应用部署到edas上面自己是比较省心省力。要想把应用部署到edas下面首先我们唯一的是准备好VM也就是ECS,来看一下这个过程是怎么样的。

 

首先来到阿里云的网站,登录进去以后一般ecs不管page在哪里,ecs都是很容易发现和找到的,产品云服务器是第一位的,选了以后,就可以创建实例。在创建实例的过程中,有几个比较注意的点和大家介绍一下,第一就是这个地域,因为各个数据中心之间,是不能通讯的,所以一定要记住,vm是在哪里拉的,如果ecs是在北京的,那edas也要在北京,如果ecs是在上海,那edas的应用也要在上海。接下来看镜像,镜像就是一个选择操纵操作系统的地方,通常大家所知道的Windows Server 、Ubuntu都在这里,因为我们要用的是edas,edas有自己的定制的一些组件,所以我们要在镜像市场里面找到edas的镜像,今天用的是一个比较简单的edas java环境,不用选分布式应用,选java版本就可以。

 

这里有不同的版本,选一个通用的,最新的。选完以后,再确认一下地域没有帮我们改掉,然后决定要买多久的时间,如果是做实验,一般一周就够了。

另外就是实例的数量,一般如果有一个service-provider和一个conciro需要两台,如果是其他的情况一台就够了,这个是根据具体的需要来定的。

公网带宽可以选择一个比较舒适的带宽,价格也会跟着涨上去。安全组是一个比较重要的事情,它保证你可以访问它,来看一下这个安全组。

 

这里面安全策略应该是比较全了,所以可以选用这个安全组。然后到系统的配置,要选一个安全密钥对,如果没有密钥对,就要自定义root的密码,或者新建密钥对,否则无法ssh到主题当中。不要选择创建后设置,这个比较麻烦。

 

现在就可以确认订单了,云服务器的服务条款一定要同意,然后就可以下单了,几分钟以后,回到ECS控制台,就可以看到刚刚所定制的ECS实例已经在运行中状态都是绿颜色的,这就是创建ECS成功

 

2.创建应用

配置了ECS以后,下面就可以开始把应用导入到edas上面,先来找到edas的服务,其实是很好找的,不管在哪里,就点产品与服务,展开这个页面以后,就到互联网中间件第一个服务就是企业级分布式应用服务edas。

刚刚在配置ECS的时候,已经用了edas的镜像,所以很多engine就不用再导入了,这是很方便的地方。到了edas的控制台以后,就到应用管理。选择应用列表,现在要创建一个应用,创建这个应用不是用service应用就是普通的应用。

 

这里很重要的一点是,确保这个命名空间和刚刚这个ECS的命名空间是在一起的,刚刚这个ECS是在北京,就是华北2,这里也继续用华北2。集群类型的就是ECS的集群,这里选择默认值的集群应用的名称是比较随意的,应用部署方式选择是JAR包,运行环境注意是用标准Java应用环境。Java环境选择的是JDK8。

 

下一步,实例指的就是ECS现在就选立刻部署,因为需要上传JAR包,选择刚刚编译好的JAR包,然后选版本号,随便1.0、2.0都可以上传好了以后,就可以选确认创建。现在就回到了应用的列表,把服务端和消费端都上传到edas上面以后,就可以对它来进行操作了。先看一下,这里写的是运行正常,变更也是成功的。

 

再看一下服务列表,就是刚刚的服务service provider。同样,这个消费端consumer也已经创建好了,我们看确认一下它也成功了,运行正常,变更也是成功的。

 

下面就可以确认部署到edas上是否是好的,我们怎么做呢?ssh到客户端。

这样做的目的是因为有的时候安全组的策略会让有的服务器ECS不能录备远程访问,为了避免没有办法去访问这种情况出现,就采取了一个比较保守的策略。用的是localhost8080,为什么是8080呢?因为刚刚在本地的时候是18082,因为把应用程序部署到edas的时候,edas其实是重写到我们的配置下,不光是8080这个端口号被改了,nacos-service也被改了,因为nacos-server是部署在云环境下的,对开发者来讲,并不知道他在哪里,本地的是localhost8848端口,但是到营上了,都是被优先级更高的配置下覆盖了,这个应用的端口也是被覆盖了。

 

现在来看一下,打印echo-edas这个字符串,等会应该看到有edas这个字符串的出现,edas出现了

[root@iz2ze7rpsdzbqiy00ufh38Z~]#curl http://localhost:888/echo-feign/edas  ledas[root@iZ2ze7rpsdzbqiy00ufh38Z~]#

再来测一下另外一个API的路径cecho-rest这是用rest template写的,打印另外一个字符串,这也是成功了。

edas[root@iZ2ze7rpsdzbqiy88ufh38Z~]#curl http://localhost:8080/echo-rest/lesson  lesson[root@iZ2ze7rpsdzbqiy00ufh38Z-]#

 

这样就证明当我们登陆到客户端以后,消费端是可以访问到服务提供方把字符串打印回来,也就证明了整个链路是通的

 

 

我的学习进度
请登录后查看您的学习进度!
立即登录
本课程相关云产品