微服务实战(三)集成服务注册发现中心 SpringCloud 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

在SpringBoot项目中使用SpringCloud Alibaba Nacos

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

工程结构如下:

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

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

<spring.boot.version>2.1.0.RELEASE</spring.boot.version>
<spring.cloud.version>Greenwich.SR2</spring.cloud.version>
<spring.cloud.alibaba.version>2.1.0.RELEASE</spring.cloud.alibaba.version>

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

完整的pom.xml文件如下

<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.zjf.csdn</groupId>
	<artifactId>combat-provider</artifactId>
	<version>0.0.1-SNAPSHOT</version>

	<description>zjf微服务实战</description>
	<name>combat-provider</name>
	<url>https://blog.csdn.net/u011177064</url>

	<properties>
        <!-- Dependency Versions -->
        <spring.boot.version>2.1.0.RELEASE</spring.boot.version>
        <spring.cloud.version>Greenwich.SR2</spring.cloud.version>
        <spring.cloud.alibaba.version>2.1.0.RELEASE</spring.cloud.alibaba.version>
    </properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
		<!-- Lombok -->
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
		</dependency>
	</dependencies>
	

	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-dependencies</artifactId>
				<version>${spring.boot.version}</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
			<dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring.cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring.cloud.alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
			
		</dependencies>
	</dependencyManagement>

	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.1</version>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
				</configuration>
			</plugin>
		</plugins>
	</build>
	
	<profiles>

        <profile>
            <id>spring</id>
            <repositories>
                <repository>
                    <id>spring-snapshots</id>
                    <name>Spring Snapshots</name>
                    <url>https://repo.spring.io/libs-snapshot-local</url>
                    <snapshots>
                        <enabled>true</enabled>
                    </snapshots>
                    <releases>
                        <enabled>false</enabled>
                    </releases>
                </repository>
                <repository>
                    <id>spring-milestones</id>
                    <name>Spring Milestones</name>
                    <url>https://repo.spring.io/libs-milestone-local</url>
                    <snapshots>
                        <enabled>false</enabled>
                    </snapshots>
                </repository>
                <repository>
                    <id>spring-releases</id>
                    <name>Spring Releases</name>
                    <url>https://repo.spring.io/release</url>
                    <snapshots>
                        <enabled>false</enabled>
                    </snapshots>
                </repository>
            </repositories>
            <pluginRepositories>
                <pluginRepository>
                    <id>spring-snapshots</id>
                    <name>Spring Snapshots</name>
                    <url>https://repo.spring.io/libs-snapshot-local</url>
                    <snapshots>
                        <enabled>true</enabled>
                    </snapshots>
                    <releases>
                        <enabled>false</enabled>
                    </releases>
                </pluginRepository>
                <pluginRepository>
                    <id>spring-milestones</id>
                    <name>Spring Milestones</name>
                    <url>https://repo.spring.io/libs-milestone-local</url>
                    <snapshots>
                        <enabled>false</enabled>
                    </snapshots>
                </pluginRepository>
                <pluginRepository>
                    <id>spring-releases</id>
                    <name>Spring Releases</name>
                    <url>https://repo.spring.io/libs-release-local</url>
                    <snapshots>
                        <enabled>false</enabled>
                    </snapshots>
                </pluginRepository>
            </pluginRepositories>
        </profile>

    </profiles>
	
</project>

application.yml 内容如下:

server:
  port: 9999
spring:
  application:
    name: nacos-provider
  cloud:
    nacos:
      discovery:
        server-addr: <Nacos服务安装后的部署IP>: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控制台看到注册进来的服务了。

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

工程结构如下:

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

application.yml 内容如下:

server:
  port: 9998
spring:
  application:
    name: nacos-consumer
  cloud:
    nacos:
      discovery:
        server-addr: <Nacos服务安装后的部署IP>: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中上线了。

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

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

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

发布了24 篇原创文章 · 获赞 75 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/u011177064/article/details/104107033