SpringBoot+Nacos+feign微服务调用

     背景

        SpringCloud微服务框架相信业内的“冤家们”都不陌生,它几乎是现行的项目研发使用的主流框架了,我们公司目前在研的多数项目都是SpringCloud框架,根据业务需要将功能拆分成一组组高内聚,低耦合的微服务。大多数情况下,各个微服务是高度自制,可以独立运行的。但是,总会有些特殊的场景,需要微服务之间进行交互、调用。之前我常用的是SpringCloud+Eureka+Feign那套方式,但最近熟悉新的项目时,意外的发现有很多项目使用的是SpringBoot+Nacos+Feign,感觉这个还挺有意思的。今天正好有空,我整理一个相关的Demo出来,用于学习和记录。

    代码实践

     1、启动Nacos服务

        1.1 启动Nacos服务非常简单,点击Nacos文件夹下bin\startup.cmd即可

        1.2 启动成功后,访问网址:http://localhost:8848/nacos/ 即可跳转到Nacos的登陆页,默认用户名和密码都是nacos,登入之后,选择左侧菜单的“命名空间”,先创建一个命名空间:

        1.3 创建好之后,点击左侧的配置管理->配置列表,选择刚才创建的命名空间,就可以看到该命名空间下的服务了,现在还没有服务注册,所以是空的。接下来咱们创建feign-server,feign-consumer注册上来,就可以在这里看到服务列表了。

        创建服务空间这一步在实际项目中经常会用到,我们需要在DEV,UAT,PROV环境中使用不同的配置,所以会在Nacos里配上不同的命名空间。

2、创建feign-server服务

        2.1 添加maven依赖

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

        2.2、yml中配置Nacos服务的地址。注意这里的namespace填的是上图配置管理里的命名空间ID。

spring:
  #nacos注册中心
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
        group: leixi
        namespace: a3b4f217-8a7f-4055-8948-c4a0c4da9e98
        enabled: true
  application:
    name: leixi-server

        2.3、启动类上添加@EnableDiscoveryClient注解,如下:

@SpringBootApplication
@EnableDiscoveryClient
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

        2.4、编写测试Controller,添加几个测试方法:

// 数据类
public class DataDto implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty("主键ID")
    private String id;
    @ApiModelProperty("用户账号")
    private String userCode;
    @ApiModelProperty("登陆密码")
    private String password;
    @ApiModelProperty("用户名称")
    private String userName;
}

//controller方法
@RestController
public class DemoController {

    @GetMapping("/getDataById")
    public DataDto getData(@RequestParam(value = "id") String id) {
        System.out.println("进入该方法 getDataById " + System.currentTimeMillis());
        DataDto dto = new DataDto();
        dto.setId(id);
        dto.setPassword("pass");
        dto.setUserCode("leixi");
        dto.setUserName("从服务方获得的数据");
        return dto;
    }

    @PostMapping("/removeDataById")
    public void removeDataById(@RequestParam(value = "id") String id) {
        System.out.println("进入该方法 removeDataById" + System.currentTimeMillis());
        System.out.println("通过feign 调用,从服务方删除数据 " + id);
    }
}

        2.5、测试。启动feign-server,通过postman测试, 可以正常调用。在Nacos的服务列表中,也可以看到这个服务。

3、构建feign-client

        假设现在需要把feign-server中的服务放开给其他服务调用,首先需要创建一个中间类的jar包,我把它取名为feign-client。构建feign-client需要做如下操作:

        3.1、添加feign接口,其中fallbackFactory 是调用方法发生异常的处理类,有条件的也可以配上

// feign接口
@FeignClient(name = "leixi-server", path = "/server", fallbackFactory = DataClientBackFactory.class)
public interface DataClient {

    @RequestMapping(value = "/getDataById", method = RequestMethod.GET)
    DataDto getDataById(@RequestParam("id") String id);

    @RequestMapping(value = "/removeDataById", method = RequestMethod.POST)
    void removeDataById(@RequestParam("id") String id);
}


// 异常处理类
@Component
public class DataClientBackFactory implements FallbackFactory<DataClient> {

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

    @Override
    public DataClient create(Throwable throwable) {
        return new DataClient() {

            @Override
            public DataDto getDataById(String id) {
                logger.info("getDataById param id=>: " + id);
                return new DataDto();
            }

            @Override
            public void removeDataById(String id)  {
                logger.info("removeDataById param id=>: " + id);
                System.out.println("根据用户删除用户信息失败!");
            }
        };
    }
}

        3.2、迁移基础类。从上面的代码中可以看到,feign-client也需要用到feign-server中的基础类如DataDto,我们可以把这类基础类都迁移到feign-client中。

        3.3、feign-client打包:将feign-client打成jar包,在pom.xml <build></build>中做如下配置

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.22.2</version>
                <configuration>
                    <skipTests>true</skipTests>
                </configuration>
            </plugin>
        </plugins>
    </build>

        3.4、 feign-server引入feign-client。刚刚把DataDto已经迁移到了feign-client里了, 那么feign-server里也要用到DataDto,怎么办?咱们在feign-server中将feign-client作为依赖包引入即可。

       <!-- 在feign-server中添加以下依赖-->
        <dependency>
            <groupId>com.leixi.client</groupId>
            <artifactId>feignClient</artifactId>
            <version>1.0</version>
        </dependency>

        其实这一步也非必须如此,如果开放的接口返回的是基础类型,或者void方法,个人认为是不需要引入feign-client依赖的。网上还有其他的实现方式,先创建feign-client,先创建feign-server,在feign-server中编写serviceImpl来实现feign-client里的接口,殊途同归,均可达到效果。

      4、创建feign-consumer

        4.1 添加Nacos 的maven依赖,引入feign-client依赖,和feign-server一样。

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

        <dependency>
            <groupId>com.leixi.client</groupId>
            <artifactId>feignClient</artifactId>
            <version>1.0</version>
        </dependency>

        4.2 依然需要在yml中添加配置

spring:
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
        group: leixi
        namespace: a3b4f217-8a7f-4055-8948-c4a0c4da9e98
        enabled: true
  application:
    name: leixi-consumer

        4.3、SpringBoot启动类做如下配置

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients(basePackages = "com.leixi.client.feignClient", defaultConfiguration = FeginokhttpConfig.class)
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

        4.4、编写一个测试方法,通过feign调用feign-server中的方法

@RestController
public class DemoController {
    @Autowired
    private DataClient client;

    @GetMapping("/getData")
    public Object getData() {
       return client.getDataById("001");
    }

    @GetMapping("/removeData")
    public Object removeData() {
         client.removeDataById("001");
         return "删除数据成功";
    }
}

        4.5 测试。启动feign-consumer后,在Nacos服务列表中可以同时看到feign-server 和feign-consumer,调用feign-consumer中的方法,得到的结果与直接调用feign-server的结果一样。本次的测试格外的顺利。

  • 21
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值