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
1.预备环境准备
Nacos 依赖 Java 环境来运行。如果您是从代码开始构建并运行Nacos,还需要为此配置 Maven环境,请确保是在以下版本环境中安装使用:
- 64 bit OS,支持 Linux/Unix/Mac/Windows,推荐选用 Linux/Unix/Mac。
- 64 bit JDK 1.8+;下载 & 配置。
- 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安装完成后,启动。
除了官网安装文档中所写的用命令接口方式使用注册、发现、配置等功能,还可以直接访问http://部署IP:8848/nacos
进入到Nacos的控制台界面,默认账号密码是 nacos/nacos
首先我们建立一个服务提供者的工程,也就是一个SpringBoot工程,和上一章一样,写一个简单的接口。与之不同的是,这个接口将会通过Nacos的discovery组件发布到Nacos的服务器上。
工程结构如下:
特别强调一下,这里主要使用了 spring-boot,spring-cloud,spring-cloud-alibaba。
其中版本分别是:(版本问题没弄清楚的话,各种编译不起来!)
这里有个详细的版本对应表: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
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控制台看到注册进来的服务了。
接下来写一个消费者工程,通过注册发现中心,去获取到目标接口的实际路径,然后进行调用。
工程结构如下:
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中上线了。
然后调用一下消费者的测试接口
对比一下实现代码,调用链是这样的:
http get请求---》消费者接口---》消费者从Nacos寻址---》获取实际接口信息---》调用实际接口