7-使用OpenFeign远程方法调用

本文用一个简单的例子演示openfeign的简单使用。

0、环境

  1. jdk 1.8
  2. nacos-server 2.0.3
  3. springboot 2.4.2
  4. Idea 2021.1

1、项目结构

在这里插入图片描述
各模块说明:

  • spring-cloud-nacos-sample-api: 对外开发的接口
  • spring-cloud-nacos-sample-provider: 服务的提供者,也就是接口的具体实现
  • spring-cloud-nacos-sample-consumer:服务的消费者

2、搭建过程

撸代码之前,请大家先把nacos环境搭建好,关于nacos的搭建,可以参考我的另一篇博文:nacos环境搭建

2.1 spring-cloud-nacos-sample

Idea创建普通maven项目,并引入如下依赖:

	<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.2</version>
    </parent>
    
	<dependencyManagement>
        <dependencies>
            <!--spring cloud -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>2020.0.1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
			
			<!--alibaba-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2021.1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
	

2.2、spring-cloud-nacos-sample-api

新增module, spring-cloud-nacos-sample-api,创建完成后,新建接口,代码如下:

public interface IHelloService {

    String sayHello(String name);
}

2.3、spring-cloud-nacos-sample-provider

新建module,spring-cloud-nacos-sample-proivder。这个模块要对外提供服务,所以要加入依赖。

	<dependencies>
        <dependency>
            <groupId>com.jackie.nacos.test</groupId>
            <artifactId>spring-cloud-nacos-sample-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <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.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>

2.3.1、新建接口,实现IHelloService。代码如下:

@Service
public class HelloServiceImpl implements IHelloService {

    @Override
    public String sayHello(String name) {
        return "Hi, " + name;
    }
}

2.3.2、创建Controller,代码如下:

@RestController
@RequestMapping("/provider")
@Slf4j
public class HelloController {

    @GetMapping("/sayHello")
    public String sayHello(@RequestParam("name") String name) {
        return service.sayHello("--------" + name);
    }

    @Autowired
    IHelloService service;
}

2.3.3、创建springboot启动文件

@SpringBootApplication
public class ProviderApplication {

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

2.3.4、添加配置文件

server:
  port: 9090
spring:
  application:
    name: nacos-sample-provider

  cloud:
    nacos:
      discovery:
        # Nacos的服务注册地址,可以配置多个,逗号分隔
        server-addr: 192.168.3.99:8848,192.168.3.99:8948
        service: nacos-sample-provider
        heart-beat-interval: 5000
        heart-beat-timeout: 20000
        # 元数据部分 - 可以自己随便定制
        metadata:
          mydata: stars
        # 客户端在启动时是否读取本地配置项(一个文件)来获取服务列表
        naming-load-cache-at-start: false
        # 命名空间ID,Nacos通过不同的命名空间来区分不同的环境,进行数据隔离,
        namespace: dev
        # 创建不同的集群
        cluster-name: Cluster-A
        # [注意]两个服务如果存在上下游调用关系,必须配置相同的group才能发起访问
        group: group1
        # 向注册中心注册服务,默认为true
        # 如果只消费服务,不作为服务提供方,倒是可以设置成false,减少开销
        register-enabled: true

2.4、spring-cloud-nacos-sample-consumer

这个模块是服务的消费端,就是远程服务调用者,先添加依赖:

	<dependencies>
        <dependency>
            <groupId>com.jackie.nacos.test</groupId>
            <artifactId>spring-cloud-nacos-sample-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--nacos discovery -->
        <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.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

    </dependencies>

2.4.1、创建openFeign接口

@FeignClient(value="nacos-sample-provider", path="/provider")
public interface HelloService {

	//这里注解里参数,要和远程服务的一致
    @GetMapping("/sayHello")
    String sayHello(@RequestParam("name")String name);
}

解释一下@FeignClient(value=“nacos-sample-provider”, path=“/provider”),第一个value,指的是服务名称,第二个path是controller对应的@RequestMapping的路径。有个这些配置,发起远程调用,会按照这些参数,拼装一个完成的调用路径。

2.4.2、创建controller

@RestController
@Slf4j
public class HelloController {

    @GetMapping("/sayHello")
    public String sayHello(@RequestParam("name") String name) {
        return helloService.sayHello(name);
    }

	//这个接口就是上面用openFeign注解的那个接口
    @Autowired
    private HelloService helloService;
}

2.4.3、创建springboot启动类

@SpringBootApplication
@EnableFeignClients(basePackages = {"com.jackie.nacos.test.consumer"})
public class ConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
        System.out.println("启动成功了");
    }
}

注意,多了一个@EnableFeignClients,包指向你接口所在的包路径。

2.4.4、application.yml

server:
  port: 9091
spring:
  application:
    name: nacos-sample-consumer

  cloud:
    nacos:
      discovery:
        server-addr: 192.168.3.99:8848,192.168.3.99:8948
        service: nacos-sample-consumer
        heart-beat-interval: 5000
        heart-beat-timeout: 20000
        # 元数据部分 - 可以自己随便定制
        metadata:
          mydata: stars
        naming-load-cache-at-start: false
        # 命名空间ID,Nacos通过不同的命名空间来区分不同的环境,进行数据隔离,
        namespace: dev
        # 创建不同的集群
        cluster-name: Cluster-stars
        # [注意]两个服务如果存在上下游调用关系,必须配置相同的group才能发起访问
        group: group1
        # 向注册中心注册服务,默认为true
        # 如果只消费服务,不作为服务提供方,倒是可以设置成false,减少开销
        register-enabled: true
logging:
  level:
    com.jackie.nacos.test.consumer.feign: debug

3、测试

启动nacos服务,启动上面provider和consumer服务,确保启动没有异常信息。用apifox发一个快捷请求,查看日志:
在这里插入图片描述
测试成功。

完整代码:github

  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值