微服务实战(三)集成服务注册发现中心 - Nacos

本章主要讲述如何使用服务注册发现中心

SpringCloud默认的注册中心 eurka  已经停止更新,通过比较,发现阿里的SpringCloud Alibaba 是一个比较不错的选择,其中它的注册中心使用的是  Nacos。

SpringCloud Alibaba的git:

https://gitee.com/mirrors/Spring-Cloud-Alibaba

https://github.com/alibaba/spring-cloud-alibaba

Nacos官网:https://nacos.io

 

Nacos的安装

1.预备环境准备

Nacos 依赖 Java 环境来运行。如果您是从代码开始构建并运行Nacos,还需要为此配置 Maven环境,请确保是在以下版本环境中安装使用:

  1. 64 bit OS,支持 Linux/Unix/Mac/Windows,推荐选用 Linux/Unix/Mac。
  2. 64 bit JDK 1.8+;下载 & 配置。
  3. Maven 3.2.x+;下载 & 配置。

2.下载源码或者安装包

你可以通过源码和发行包两种方式来获取 Nacos。

从 Github 上下载源码方式

git clone https://github.com/alibaba/nacos.git
cd nacos/
mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U  
ls -al distribution/target/

// change the $version to your actual path
cd distribution/target/nacos-server-$version/nacos/bin

下载编译后压缩包方式

您可以从 最新稳定版本 下载 nacos-server-$version.zip 包。

  unzip nacos-server-$version.zip 或者 tar -xvf nacos-server-$version.tar.gz
  cd nacos/bin

3.启动服务器

Linux/Unix/Mac

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

sh startup.sh -m standalone

如果您使用的是ubuntu系统,或者运行脚本报错提示[[符号找不到,可尝试如下运行:

bash startup.sh -m standalone

Windows

启动命令:

cmd startup.cmd

或者双击startup.cmd运行文件。

4.服务注册&发现和配置管理

服务注册

curl -X POST 'http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=nacos.naming.serviceName&ip=20.18.7.10&port=8080'

服务发现

curl -X GET 'http://127.0.0.1:8848/nacos/v1/ns/instance/list?serviceName=nacos.naming.serviceName'

发布配置

curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test&content=HelloWorld"

获取配置

curl -X GET "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test"

5.关闭服务器

Linux/Unix/Mac

sh shutdown.sh

Windows

cmd shutdown.cmd

或者双击shutdown.cmd运行文件。

Nacos安装完成后,启动。

 

Nacos控制台

除了官网安装文档中所写的用命令接口方式使用注册、发现、配置等功能,还可以直接访问http://部署IP:8848/nacos

进入到Nacos的控制台界面,默认账号密码是  nacos/nacos

微服务实战(三)集成服务注册发现中心 - Nacos_第1张图片

 

在SpringBoot项目中使用SpringCloud Alibaba Nacos

首先我们建立一个服务提供者的工程,也就是一个SpringBoot工程,和上一章一样,写一个简单的接口。与之不同的是,这个接口将会通过Nacos的discovery组件发布到Nacos的服务器上。

工程结构如下:

微服务实战(三)集成服务注册发现中心 - Nacos_第2张图片

 

特别强调一下,这里主要使用了 spring-boot,spring-cloud,spring-cloud-alibaba。

其中版本分别是:(版本问题没弄清楚的话,各种编译不起来!

2.1.0.RELEASE
Greenwich.SR2
2.1.0.RELEASE

这里有个详细的版本对应表:https://start.spring.io/actuator/info

完整的pom.xml文件如下


	4.0.0
	com.zjf.csdn
	combat-provider
	0.0.1-SNAPSHOT

	zjf微服务实战
	combat-provider
	https://blog.csdn.net/u011177064

	
        
        2.1.0.RELEASE
        Greenwich.SR2
        2.1.0.RELEASE
    

	
		
			org.springframework.boot
			spring-boot-starter-web
		
		
            org.springframework.boot
            spring-boot-starter-actuator
        
		
			org.springframework.boot
			spring-boot-starter-test
			test
		
		
            com.alibaba.cloud
            spring-cloud-starter-alibaba-nacos-discovery
        
		
		
			org.projectlombok
			lombok
		
	
	

	
		
			
				org.springframework.boot
				spring-boot-dependencies
				${spring.boot.version}
				pom
				import
			
			
                org.springframework.cloud
                spring-cloud-dependencies
                ${spring.cloud.version}
                pom
                import
            
            
                com.alibaba.cloud
                spring-cloud-alibaba-dependencies
                ${spring.cloud.alibaba.version}
                pom
                import
            
			
		
	

	
		
			
				org.apache.maven.plugins
				maven-compiler-plugin
				3.1
				
					1.8
					1.8
				
			
		
	
	
	

        
            spring
            
                
                    spring-snapshots
                    Spring Snapshots
                    https://repo.spring.io/libs-snapshot-local
                    
                        true
                    
                    
                        false
                    
                
                
                    spring-milestones
                    Spring Milestones
                    https://repo.spring.io/libs-milestone-local
                    
                        false
                    
                
                
                    spring-releases
                    Spring Releases
                    https://repo.spring.io/release
                    
                        false
                    
                
            
            
                
                    spring-snapshots
                    Spring Snapshots
                    https://repo.spring.io/libs-snapshot-local
                    
                        true
                    
                    
                        false
                    
                
                
                    spring-milestones
                    Spring Milestones
                    https://repo.spring.io/libs-milestone-local
                    
                        false
                    
                
                
                    spring-releases
                    Spring Releases
                    https://repo.spring.io/libs-release-local
                    
                        false
                    
                
            
        

    
	

application.yml 内容如下:

server:
  port: 9999
spring:
  application:
    name: nacos-provider
  cloud:
    nacos:
      discovery:
        server-addr: :8848
management:
  endpoints:
    web:
      exposure:
        include: "*"

 写一个简单的Rest接口

package com.zjf.combat.api.nacos;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class NacosProviderApi {

    @GetMapping(value = "/nacos/{string}")
    public String nacos(@PathVariable String string) {
        return "Hello Nacos Discovery " + string;
    }
}

SpringBoot的启动类,需要添加 @EnableDiscoveryClient 注解,将扫描到的接口注册到Nacos服务中心。 

package com.zjf.combat;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.context.annotation.ComponentScan;

/**
 * Nacos 启动器
 * @author zhaojunfu
 *
 */
@SpringBootApplication
@EnableDiscoveryClient
@ComponentScan
public class NacosApplication {

	public static void main(String[] args) {
		 SpringApplication.run(NacosApplication.class, args);
	}
}

如果像我一样幸运的话,写好这些,直接运行起来,就可以在Nacos控制台看到注册进来的服务了。

微服务实战(三)集成服务注册发现中心 - Nacos_第3张图片

 

微服务实战(三)集成服务注册发现中心 - Nacos_第4张图片

 

接下来写一个消费者工程,通过注册发现中心,去获取到目标接口的实际路径,然后进行调用。

工程结构如下:

微服务实战(三)集成服务注册发现中心 - Nacos_第5张图片

pom.xml 与 服务提供者的pom.xml保持一样就行。

application.yml 内容如下:

server:
  port: 9998
spring:
  application:
    name: nacos-consumer
  cloud:
    nacos:
      discovery:
        server-addr: :8848
management:
  endpoints:
    web:
      exposure:
        include: "*"

消费者工程主要是通过   LoadBalancerClient   从Nacos注册中心获取< ID:nacos-provider 服务提供者>注册上去的接口信息,包括IP,端口等,然后用RestTemplate拼接好完整的接口地址去调用。现在还没有涉及到服务网关这些组件,仅仅是去实践服务注册与发现中心的功能,后续是由网关负责接口寻址,负载均衡这些。

 

package com.zjf.combat.api.nacos;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
public class NacosConsumerApi {

	@Value("${spring.application.name}")
	private String appName;

	private RestTemplate restTemplate = new RestTemplate();
	@Autowired
	private LoadBalancerClient loadBalancerClient;

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

		// 使用 LoadBalanceClient 和 RestTemolate 结合的方式来访问
		ServiceInstance serviceInstance = loadBalancerClient.choose("nacos-provider");
		String url = String.format("http://%s:%s/nacos/%s", serviceInstance.getHost(), serviceInstance.getPort(),
				appName);
		System.out.println("request url:" + url);
		return restTemplate.getForObject(url, String.class);
	}

}

启动消费者工程,然后再去Nacos控制台瞅一瞅!此时消费者和生产者都在Nacos中上线了。

微服务实战(三)集成服务注册发现中心 - Nacos_第6张图片

然后调用一下消费者的测试接口

微服务实战(三)集成服务注册发现中心 - Nacos_第7张图片

对比一下实现代码,调用链是这样的:

http get请求---》消费者接口---》消费者从Nacos寻址---》获取实际接口信息---》调用实际接口

 

微服务实战(三)集成服务注册发现中心 - Nacos_第8张图片

 

你可能感兴趣的:(微服务架构实战)