nacos笔记(二)注册中心

全部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的注册中心的基本功能已经写完

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值