springCloud的ribbon和feign

ribbon方式调用

就是将原来的具体地址,改为了通过服务名去调用。注册中心中有多个服务,相同服务名,就会算作可以调用的服务。

首先得有一个注册中心,然后各种服务注册进去,然后利用ribbon或者feign去调用。

ribbon是直接用地址拼接,然后调用。

feign通过对外编写接口,然后实现接口逻辑,外部消费者调用接口,就类似我又写了一个给其他服务使用的controller,然后去实现具体逻辑。我自己服务的controller是给前端调用的。

先编写给其他服务调用的controller(feign)的api:

java 复制代码
package com.cloudUser.cloudUserApi.api;

import com.cloudUser.cloudUserApi.dto.UserDto;
import com.common.util.Result;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

/**
 * @program: springCloudPuls
 * @author: quxiao
 * @create: 2024-01-14 09:32
 **/
@Component
@FeignClient(value = "cloude-user-server")
public interface UserApi {

    @ApiOperation(value = "通过id获取用户", notes = "通过id获取用户")
    @GetMapping("/getUserById")
    Result<UserDto> getUserById( @RequestParam("id")Integer id);

}
复制代码
@FeignClient(value = "注册再eureka中心的名称")

8001、8002、8003的这个名称都是一样的,所以ribbon可以有一个负载均衡去调用它。

实现我这个接口的具体逻辑:

java 复制代码
package com.cloudUser.cloudUserServer.fegin.impl;

import com.cloudUser.cloudUserApi.api.UserApi;
import com.cloudUser.cloudUserApi.dto.UserDto;
import com.cloudUser.cloudUserServer.service.UserService;
import com.cloudUser.cloudUserServer.vo.UserVO;
import com.common.util.Result;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RestController;

/**
 * @program: springCloudPuls
 * @author: quxiao
 * @create: 2024-01-21 09:15
 **/
@RestController
public class UserApiImpl implements UserApi {

    @Autowired
    UserService userService;

    @Override
    public Result<UserDto> getUserById(Integer id) {
        UserVO vo = userService.getUserById(id);
        UserDto dto = new UserDto();
        BeanUtils.copyProperties(vo, dto);
        return Result.success(dto);
    }
}

就是实现接口,编写逻辑就好。8001、8002、8003都要实现一次(具体开发的时候不需要,只需要运行的时候指定不同的端口好就好了)

一定得注意这里的参数,需要用@RequestParam,不然参数会传输异常,报错405

FeignClient调用报错405请求方法错误_feignclient requestline get 405-CSDN博客

模拟外部服务调用:

就是普通的controller,也可以是别的地方,主要是要注入这个接口,然后调用它。

外部服务调用的启动类i,需要获取到将接口加载到spring中":

复制代码
@EnableFeignClients(basePackageClasses = {UserApi.class})

指定类,加载bean中,不然

复制代码
@Autowired
UserApi userApi;

就会找不到bean,

复制代码
@EnableDiscoveryClient

就是开启feign。

8001、8002、8003也已经开启了的哦。

相关推荐
oneDay++3 分钟前
# IntelliJ IDEA企业版开发入门:包、类与项目结构详解
java·经验分享·学习·intellij-idea·学习方法
程序员阿鹏4 分钟前
Git的安装和配置(idea中配置Git)
java·开发语言·ide·git·intellij-idea·idea
Musennn40 分钟前
102. 二叉树的层序遍历详解:队列操作与层级分组的核心逻辑
java·数据结构·算法·leetcode
越来越无动于衷1 小时前
java数组题(5)
java·算法
松树戈1 小时前
openfeign与dubbo调用下载excel实践
vue.js·spring cloud·elementui·dubbo
Mikey_n1 小时前
Spring Boot 注解详细解析:解锁高效开发的密钥
java·spring boot·后端
_yingty_1 小时前
Java设计模式-策略模式(行为型)
java·设计模式·策略模式
lichuangcsdn1 小时前
【springcloud学习(dalston.sr1)】使用Feign实现接口调用(八)
学习·spring·spring cloud
小小寂寞的城1 小时前
Jenkins里构建一个简单流水线
java·运维·jenkins
wowocpp2 小时前
idea springboot 配置文件 中文显示
java·spring boot·intellij-idea