全部nacos笔记地址
nacos笔记(一)单机版
nacos笔记(二)注册中心
nacos笔记(三)配置中心
nacos笔记(四)集群与持久化
创建服务提供者
首先父pom中引入依赖,只贴一部分与本项目有关的
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.2.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
创建module: cloud-alibaba-provider-payment9001
maven依赖,由于我这里依赖了父pom,所以就不用写版本号了
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<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>
application.yml
server:
port: 9001
spring:
application:
name: nacos-payment-provider #这个服务的名称
cloud:
nacos:
discovery:
server-addr: 192.168.0.116:8848 #注册中心的地址
management:
endpoints:
web:
exposure:
include: '*' #actuator暴露所有短点
主启动类,nacos使用了原本springcloud中就有的@EnableDiscoveryClient
注解来开启服务发现与注册
@SpringBootApplication
@EnableDiscoveryClient # 开启服务发现
public class PaymentNacosMain9001 {
public static void main(String[] args) {
SpringApplication.run(PaymentNacosMain9001.class, args);
}
}
至此就可以启动了,此时启动服务就可以看到注册中心有我们的服务了
再写一个controller来测试服务调用,里面就一个方法,返回本服务的端口号
@RestController
public class PaymentController {
@Value("${server.port}")
private String serverPort;
@GetMapping("/payment/{id}")
public String getPayment(@PathVariable("id") Integer id) {
return "nacos register, serverPort: " + serverPort + "\t id: " + id;
}
}
重启项目,测试 http://localhost:9001/payment/1
nacos默认集成了ribbon来做负载均衡,所以我这里再创建一个一模一样的payment项目来测试,端口号为9002,和上面的步骤除了端口号都一样,过程就略过了
由于这篇只是记录一下nacos作为注册中心如何使用,所以我就不去整合mybatis走数据库的数据了,下面来创建另一个服务来调用它
创建服务消费者
创建一个新的服务,就是用来调用上面创建的服务的
服务名称 cloud-alibaba-consumer-nacos-order83
maven依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<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>
</dependencies>
application.yml
server:
port: 83
spring:
application:
name: nacos-order-consumer
cloud:
nacos:
discovery:
server-addr: 192.168.0.116:8848
#消费者将要去访问的微服务名称
server-url:
nacos-user-service: http://nacos-payment-provider
主启动类里面开启服务注册与发现
@SpringBootApplication
@EnableDiscoveryClient
public class OrderNacosMain83 {
public static void main(String[] args) {
SpringApplication.run(OrderNacosMain83.class, args);
}
}
使用RestTemplate远程调用
创建配置类,RestTemplate的bean上添加注解@LoadBalanced
开启负载均衡
@Configuration
public class ApplicationConfigContext {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
编写调用的Controller
@RestController
public class OrderController {
@Resource
private RestTemplate restTemplate;
@Value("${server-url.nacos-user-service}")
private String serverUrl;
@GetMapping("/consumer/payment/{id}")
public String payment(@PathVariable("id") Integer id){
return "this is consumer" + restTemplate.getForObject(serverUrl+"/payment/"+id, String.class);
}
}
齐活,启动项目测试一下
先看nacos控制台,可以看到三个服务都在里面了,两个nacos-payment-provider
和一个
nacos-order-consumer
调一下接口试试
http://localhost:83/consumer/payment/1
先访问了9001,刷新一下
因为默认的负载均衡采用的是轮询的方式,所以和预期的一样,第二次访问了9002
至此restTemplate远程调用的方式就完成了
下面来集成一下OpenFeign
OpenFeign远程调用
还是 order83 这个项目,稍加改动
先在maven中添加openFeign的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
主启动类添加注解 @EnableFeignClients
来开启远程调用
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients//开启OpenFeign的远程调用,千万别忘了这块
public class OrderNacosMain83 {
public static void main(String[] args) {
SpringApplication.run(OrderNacosMain83.class, args);
}
}
根据payment的接口创建service接口,这里@FeignClient
注解也可以直接使用配置文件中的配置
@FeignClient(name = "${server-url.nacos-user-service}")
public interface PaymentService {
@GetMapping("/payment/{id}")
String getPayment(@PathVariable("id") Integer id);
}
修改controller,不再需要RestTemplate了,url也不用写在这里了
@RestController
@Slf4j
public class OrderController {
@Resource
private PaymentService paymentService;
@GetMapping("/consumer/payment/{id}")
public String payment(@PathVariable("id") Integer id){
return paymentService.getPayment(id);
}
}
齐活,启动项目测试下
和预期结果一样
将OpenFeign的接口定义成一个公共模块
实际生产中,一个接口肯定不会只有一个消费者来调用,总不能谁调用谁就写一遍PaymentService接口吧,重复的事完全没有意义,所以我们要把这个接口提出来
新建module(名字随便起):cloud-alibaba-nacos-feignClient
由于这个模块只负责定义接口,所以依赖也比较少,当然如果有参数类型返回值类型等信息,也可以直接写在这个模块中,或者定义一个更基本存放对象信息的模块,然后在这里引用
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
创建接口
注意这块@FeignClient
的值也是从配置文件中读的,但是我们在这个模块不需要定义application.yml,当引用了这个模块后,会从引用这个模块的项目中读取配置文件的值
@FeignClient(name = "${server-url.nacos-user-service}")
public interface PaymentService {
@GetMapping("/payment/{id}")
String getPayment(@PathVariable("id") Integer id);
}
然后使用IDEA的maven插件的install命令将这个模块发布到仓库中
发布完成后,再次修改order83项目,先将原本项目中的PaymentService移除掉
将我们刚创建的模块的依赖添加进来
<dependency>
<groupId>com.jxw.springcloud</groupId>
<artifactId>cloud-alibaba-nacos-feignClient</artifactId>
<version>${project.version}</version>
</dependency>
然后controller中重新修改一下PaymentService
的引用就好了,后面的测试结果和前面一样就不在贴图了
至此,nacos的注册中心的基本功能已经写完