一遍文章带你掌握nacos和openFign远程调用

前言

Nacos 是一个用于动态服务发现、配置管理和服务管理的平台,尤其适用于微服务架构和云原生应用。它的核心功能主要包括服务发现与注册、配置管理以及动态 DNS 服务。

一,介绍

1.1 主要功能

服务发现与注册
Nacos 允许服务注册自身并在需要时进行发现。这对于微服务架构中的服务间通信至关重要。服务实例可以动态地添加和删除,Nacos 会实时更新服务列表,确保服务发现的高可用性。

配置管理
Nacos 提供了一个集中式的配置管理解决方案,可以动态地管理应用的配置项。通过 Nacos,开发者可以在运行时更新配置而无需重启应用。此外,Nacos 支持配置的版本管理和回滚,方便配置的变更和追踪。

动态 DNS 服务
Nacos 提供动态 DNS 服务,可以用于构建服务网格或其他基于 DNS 的负载均衡策略。它使服务发现变得更加灵活,适应性更强。

1.2 特性

易于集成
Nacos 提供了丰富的 SDK 和 RESTful API,支持多种编程语言和框架,便于集成到现有系统中。
高可用性
Nacos 支持集群部署,保证了服务注册、发现和配置管理的高可用性。
灵活的配置
支持动态配置、版本管理和回滚,方便配置的管理和变更。
多种服务健康检查方式:Nacos 支持多种健康检查方式,确保服务的可用性和稳定性。

二,启动nacos

1.下载安装包

https://github.com/alibaba/nacos/releases

2.创建数据库脚本
修改conf目录下的nacos-mysql.sql文件
在脚本开头加上创建数据库的脚本,比如

DROP DATABASE IF EXISTS `nacos_config`;
CREATE DATABASE `nacos_config` DEFAULT character set utf8mb4;
SET names utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
USE `nacos_config`;

如下图
在这里插入图片描述然后进入数据库运行该脚本
3.修改conf目录下的application.properties文件
在这里插入图片描述确保能够连接到刚刚创建的数据库

4.修改bin目录下文件
右键编辑:bin/startup.cmd
把MODE=“cluster” 改为 MODE=“standalone”
(即将nacos的启动模式从集群模式改为单机模式,记得点保存),
然后双击startup.cmd

5.运行测试

访问:http://localhost:8848/nacos/

账号密码:nacos/nacos
在这里插入图片描述

三,注册中心体验

3.1 添加相关依赖

 <properties>
    <java.version>8</java.version>
    <spring-cloud.version>2021.0.7</spring-cloud.version>
</properties>

 <dependencies>
         <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>2021.1</version>
        </dependency>

   <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
    </dependency>
 </dependencies>

3.2 更改yaml文件配置

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
  application:
    name: skr-hello

3.3 启动器添加注册服务的注解

@SpringBootApplication
@EnableDiscoveryClient //实现服务的注册
public class StudyApplication {
    public static void main(String[] args) {
        SpringApplication.run(StudyApplication.class, args);
    }
}

启动开关类,可以看到nacos中可以找寻到指定服务
在这里插入图片描述

四,OpenFeign服务调用(核心)

OpenFeign 是一个用于发起 RESTful Web 服务调用的声明式 HTTP 客户端。它允许你定义一个接口并使用注解进行标注,然后自动生成调用 REST API 所需的实现。Feign 不做任何请求处理,通过处理注解相关信息生成 Request,并对调用返回的数据进行解码,从而实现 简化 HTTP API 的开发
4.1 添加依赖

<properties>
    <java.version>8</java.version>
    <spring-cloud.version>2021.0.7</spring-cloud.version>
</properties>
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-loadbalancer</artifactId>
    </dependency>
    <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>
        <version>2021.1</version>
    </dependency>
     </dependencies>   

4.2 定义需要被远程调用的接口,即生产者

@FeignClient("skr-hello")
public interface provider {
    @GetMapping("/api/hello/hi")
    R hi();
}

4.3 定义暴漏出去的接口,即消费者

@RestController
public class CloudController {
    //生产者
    @GetMapping("/api/hello/hi")
    public R hi() {
        return new R(0, "OK", "来玩不?");
    }

    
    //消费者
    @Resource
    private Provider provider;
    @GetMapping("/api/hello/hi1")
    public R hi1() {
        return provider.hi();
    }
}

然后我们请求消费者接口,可以知道生产者接口被调用了。
原理即是:当我们请求/api/hello/hi1,会调用Provider.hi()接口,然后openfeign会根据注解,生成请求,去调用生产者接口

五,openFign参数问题
如果通过OpenFeign调用提供者的接口有参数,那么必须使用对应的注解,否则报错:

1.参数形式-键值对

必须使用@RequestParam(“名”)

2.参数形式-Json(对象、集合)

必须使用@RequestBody 配合post请求

示例代码:

@FeignClient(value = "lx-testprovider")
public interface TestProvider {
    /**
     * 远程调用时:
     * 1.请求方式一样
     * 2.请求路径一样
     * 3.返回值一样
     * 4.参数一样(request、response不用写)*/
    @GetMapping("/server/test/t1")
    R t1();
    /**
     * 接口有参数,而且参数格式为键值对
     * 必须加注解:@RequestParam("名称") */
    @GetMapping("/server/test/t2")
    R t2(@RequestParam("name") String name);

    @PostMapping("/server/test/t3")
    public R t3(@RequestParam("num1") int num1,@RequestParam("num2") int num2);

    /**
     * 接口有参数:而且参数的格式为json
     * 使用注解:@RequestBody*/
    @PostMapping("/server/test/t4")
    R t4(@RequestBody UserBo bo);
}

总结:通过nacos将需要被调用的服务注册:
1.yaml文件指定服务名称,以及服务地址
2.开关类开启注册nacos,从而将服务注册到nacos

被暴漏在外的消费者接口使用openFeign调用nacos上已经注册的服务
1.@FeignClient注解,指定服务名
2.@GetMapping(“/api/hello/hi”) 请求地址注解表明该服务的具体哪一个接口
3.要和实际的生产者接口参数保持一致:@RequestParam(“name”) name 以及@RequestBody

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值