Alibaba Nacos实现微服务远程调用

1. 概述

Nacos用于发现、配置和管理微服务,提供一组简单易用的特性集,可以快速实现动态服务发现、服务配置、服务元数据及流量管理,Nacos实现服务远程调用,常用的方法是RestTemplate结合@LoadBalanced和Feign
版本说明
2021.x 分支对应的是 Spring Cloud 2021 与 Spring Boot 2.6.x,最低支持 JDK 1.8
2020.0 分支对应的是 Spring Cloud 2020 与 Spring Boot 2.4.x,最低支持 JDK 1.8
2.2.x 分支对应的是 Spring Cloud Hoxton 与 Spring Boot 2.2.x,最低支持 JDK 1.8
更多版本说明请参阅官网
特别说明:需要提前安装好nacos服务器

2. 服务生产端实现

2.1. 引入核心依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</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-actuator</artifactId>
    </dependency>
</dependencies>

2.2. application.yml文件

server:
  port: 8100
spring:
  application:
    name: alibaba-service-provider
  cloud:
    nacos:
      discovery:
        server-addr: XX.XX.XX.XX:8848
        enabled: true
      username: nacos
      password: nacos
management:
  endpoints:
    web:
      exposure:
        include: '*'
  endpoint:
    health:
      show-details: always

2.3. 主启动类

@SpringBootApplication
@EnableDiscoveryClient
public class ServiceProviderApplication {

    public static void main(String[] args) {
        SpringApplication.run(ServiceProviderApplication.class, args);
    }
}

2.4. 生产端controller

@RestController
@RequestMapping("/service")
public class ServiceProviderController {

    private static final Logger logger = LoggerFactory.getLogger(ServiceProducerController.class);

    @GetMapping("/getServiceInfo")
    private String getServiceInfo() {
        logger.info("远程接口调用提供方,当前时间为:{}", LocalDateTime.now());
        return "This is service provider,now is:" + LocalDateTime.now();
    }
}

3. 使用RestTemplate实现远程调用

3.1. 引入核心依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</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-actuator</artifactId>
    </dependency>
</dependencies>

3.2. application.yml文件

server:
  port: 8101
spring:
  application:
    name: alibaba-ribbon-consumer
  cloud:
    nacos:
      discovery:
        server-addr: xx.xx.xx.xx:8848
        fail-fast: true
      username: nacos
      password: nacos

management:
  endpoints:
    web:
      exposure:
        include: '*'

3.3. 主启动类

@SpringBootApplication
@EnableDiscoveryClient
public class RibbonConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(RibbonConsumerApplication.class, args);
    }

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

3.4. 消费端controller

@RestController
@RequestMapping("/ribbon")
public class RibbonConsumerController {

    private static final Logger logger = LoggerFactory.getLogger(RibbonConsumerController.class);

    @Autowired
    private RestTemplate restTemplate;
    @Autowired
    private DiscoveryClient discoveryClient;

    @GetMapping("/getServiceInfoForUrl")
    public String getServiceInfoForUrl() {
        List<ServiceInstance> instances = discoveryClient.getInstances("alibaba-service-provider");
        int index = new Random().nextInt(instances.size());
        ServiceInstance serviceInstance = instances.get(index);
        String url = serviceInstance.getHost() + ":" + serviceInstance.getPort();
        logger.info("从nacos中获取到的微服务地址为:", url);
        return restTemplate.getForObject("http://" + url + "/service/getServiceInfo", String.class);
    }
}

3.5. 验证RestTemplate调用

在浏览器输入http://localhost:8101/ribbon/getServiceInfoForUrl
restTemplate调用

4. 实现RestTemplate服务调用负载均衡

4.1. 引入核心依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

注意:新版本中必须要引入spring-cloud-starter-loadbalancer依赖,否则会报java.net.UnknownHostException异常

4.2. 添加@LoadBalanced注解

在主启动类中的restTemplate()方法上添加@LoadBalanced注解

@Bean
@LoadBalanced
public RestTemplate restTemplate() {
    return new RestTemplate();
}

4.3. 负载均衡调用方法

@GetMapping("/getServiceInfo")
public String getServiceInfo() {
    return restTemplate.getForObject("http://alibaba-service-provider/service/getServiceInfo", String.class);
}

4.4. 验证负载均衡调用

在浏览器输入地址http://localhost:8101/ribbon/getServiceInfo
负载均衡调用

5. 使用openfeign实现远程调用

5.1. 引入核心依赖

新建一个springboot项目,引入核心依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-loadbalancer</artifactId>
    </dependency>
</dependencies>

5.2. application.yml文件

server:
  port: 8102
spring:
  application:
    name: alibaba-openfeign-consumer
  cloud:
    nacos:
      discovery:
        server-addr: xx.xx.xx.xx:8848
        fail-fast: true
      username: nacos
      password: nacos

management:
  endpoints:
    web:
      exposure:
        include: '*'
logging:
  level:
    com.xlhj.cloud.alibaba.service.ProviderService: debug

5.3. openfeign配置文件

@Configuration
public class OpenFeignConfig {

    @Bean
    Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;
    }
}

配置日志等级

5.4. 容错处理类

public class ProviderServiceFallback implements ProviderService {

    @Override
    public String getServiceInfo() {
        return "get service info fallback!";
    }
}

5.5. Feign调用接口

@FeignClient(value = "alibaba-service-provider", fallback = ProviderServiceFallback.class, configuration = OpenFeignConfig.class)
public interface ProviderService {

    @GetMapping(value = "/service/getServiceInfo")
    String getServiceInfo();
}

5.6. Feign调用controller

@RestController
@RequestMapping("/openfeign")
public class OpenFeignConsumerController {

    private static final Logger logger = LoggerFactory.getLogger(OpenFeignConsumerApplication.class);

    @Autowired
    private ProviderService providerService;

    @GetMapping("/getServiceInfo")
    public String getServiceInfo() {
        String serviceInfo = providerService.getServiceInfo();
        logger.info("openfeign调用远程接口返回为:{}", serviceInfo);
        return serviceInfo;
    }
}

5.7. 验证OpenFeign调用

在浏览器输入http://localhost:8102/openfeign/getServiceInfo
openfeign调用

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
内部服务调用是指在一个系统内部,不同的模块或服务之间通过调用API或函数的方式进行数据传递和交互的过程。通过内部服务调用,不同的模块可以共享资源和功能,并且实现系统的整体协同工作。 Nacos是阿里巴巴开源的一款服务发现和配置管理工具。它提供了服务注册、服务发现和服务配置的功能,让微服务架构中的各个服务能够动态地注册、发现和管理。Nacos支持多种服务注册和发现方式,包括通过DNS、HTTP和gRPC等多种协议。同时,Nacos还能够提供动态配置管理功能,可以帮助开发人员对各个服务的配置进行统一管理和动态更新。 内部服务调用与Nacos的关系在于,Nacos可以作为内部服务调用的服务治理工具。通过Nacos提供的服务注册和发现功能,不同的模块可以方便地找到需要调用的服务,并进行可靠的远程调用。此外,Nacos还能够提供服务的负载均衡和故障转移功能,可以确保内部服务调用的高可用性和稳定性。另外,Nacos还能够作为内部服务调用的配置中心,帮助开发人员对各个模块的配置进行统一管理和动态更新。 总之,内部服务调用是微服务架构中不同模块之间进行数据传递和交互的过程,而Nacos是一款服务发现和配置管理工具,在内部服务调用中可以发挥服务注册、发现、负载均衡和配置管理的作用,帮助开发人员更好地进行内部服务调用的治理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值