一、Eureka 与 Nacos 共同点
1、都提供服务注册和服务拉取
2、支持服务提供者心跳方式做健康检测
二、Eureka 与 Nacos 区别
1、Eureka 主要是CP模式;Nacos 默认是AP模式
2、Nacos集成了服务注册拉取,还集成了配置中心
三、Nacos开启
1、获得Nacos:Nacos 快速开始
2、安装Nacos(主要是Linux下)
下载:https://github.com/alibaba/nacos/releases
解压:tar -xvf nacos-server-1.4.0.tar.gz
进入安装目录:cd nacos/bin
运行:sh startup.sh -m standalone
关闭:sh shutdown.sh
可以参考同行文章:在linux上安装nacos【非常详细】_linux安装nacos_已转行@的博客-CSDN博客
3、运行Nacos
Windows 环境下: 直接双击 startup.cmd 运行
Linux环境下 :sh startup.sh -m standalone
四、使用Nacos,注册服务并提供配置
1、创建一个服务提供项目:demoNacosProvider
2、添加必要Maven引用
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.SR2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>0.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2.2.0.RELEASE</version>
</dependency>
手工增加一个配置文件前置引导的配置文件:bootstrap.yml。这个文件的目的是在启动本项目前就会加载该配置文件,通过该配置文件引导本项目从Nacos配置中心获取本项目的配置。
# bootstrap.yml
spring:
application:
name: provider-service
profiles:
active: dev
cloud:
nacos:
config:
server-addr: 116.62.62.107:8848 # nacos 配置中心地址
file-extension: yaml # 文件扩展名, {prefix}-{spring.profile.active}.${file-extension} prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
在本项目的启动文件添加用于注册服务的注解:@EnableDiscoveryClient
@EnableDiscoveryClient
@SpringBootApplication
public class DemoNacosProviderApplication {
public static void main(String[] args) {
SpringApplication.run(DemoNacosProviderApplication.class, args);
}
}
在添加一个Controller,用于测试提供服务
@RefreshScope
@Controller
public class helloController {
@Value("${mytui.name}")
private String mytui_name;
@ResponseBody
@RequestMapping(path = "/nacos/sayHello", method = RequestMethod.GET, produces = "application/json;charset=UTF-8")
public String sayHello(@RequestParam String name){
return "hello nacos config="+mytui_name+" "+name;
}
}
由于本项目用到了Nacos的配置中心内容,所以必须在Nacos添加一个配置,前面的bootstrap.yml文件就是引导到该配置上。如果不添加此配置,本服务提供项目将无法正常运行,因为读取不到配置。
五、利用Nacos发现服务,并实现服务调用
1、创建一个新的消费者项目:demoNacosConsumer
定义一个项目配置文件:application.yml
# application.yml
server:
port: 9002
spring:
application:
name: nacos-discovery-client
cloud:
nacos:
discovery:
server-addr: 116.62.62.107:8848
该配置定义了自己的注册名、注册中心服务器地址
在该项目启动文件添加服务发行注解和后面微服务间调用的一种实现方式:Feign
@EnableFeignClients //用于Feign方式调用其他微服务方法
@EnableDiscoveryClient //用于服务注册
@SpringBootApplication
public class DemoNacosConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(DemoNacosConsumerApplication.class, args);
}
}
服务之间调用方式一
使用restTemplate+ loadBalancerClient 合成服务器名的方式调用其他微服务方法:
@Autowired
LoadBalancerClient loadBalancerClient;
/**
* 使用restTemplate+loadBalancerClient结合方式调用另外微服务方法
* @return
*/
@ResponseBody
@RequestMapping(path = "/nacos/callHello1", method = RequestMethod.GET, produces = "application/json;charset=UTF-8")
public String callHello(){
ServiceInstance serviceInstance= loadBalancerClient.choose("provider-service");
String url=serviceInstance.getUri()+"/nacos/sayHello?name="+"sunjin";
RestTemplate restTemplate=new RestTemplate();
String remoteResult = restTemplate.getForObject(url,String.class);
return remoteResult;
}
服务之间调用方式二
使用Feign 方式,定义一个接口,再在需要的地方自动注入(动态代理的原理)接口对象,该接口无需手动实现。
接口通过FeignClient注解,指定服务名,在实际接口方法上,用注解RequestMapping指定实际方法路径。
上接口代码
@FeignClient(name="provider-service")
public interface HellowProvider {
@ResponseBody
@RequestMapping(path = "/nacos/sayHello", method = RequestMethod.GET, produces = "application/json;charset=UTF-8")
String saySayHello(@RequestParam String name);
}
实际调用代码,自动注入一个接口对象,使用时直接调用接口方法:
@Autowired
HellowProvider hellowProvider;
/**
* 使用feign方式调用另外微服务方法
* @param name
* @return
*/
@ResponseBody
@RequestMapping(path = "/nacos/callHello2", method = RequestMethod.GET, produces = "application/json;charset=UTF-8")
public String saySayHello(String name) {
return hellowProvider.saySayHello("mytui");
}