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也已经开启了的哦。

相关推荐
ok!ko2 小时前
设计模式之原型模式(通俗易懂--代码辅助理解【Java版】)
java·设计模式·原型模式
2402_857589362 小时前
“衣依”服装销售平台:Spring Boot框架的设计与实现
java·spring boot·后端
吾爱星辰3 小时前
Kotlin 处理字符串和正则表达式(二十一)
java·开发语言·jvm·正则表达式·kotlin
哎呦没3 小时前
大学生就业招聘:Spring Boot系统的架构分析
java·spring boot·后端
编程、小哥哥4 小时前
netty之Netty与SpringBoot整合
java·spring boot·spring
IT学长编程5 小时前
计算机毕业设计 玩具租赁系统的设计与实现 Java实战项目 附源码+文档+视频讲解
java·spring boot·毕业设计·课程设计·毕业论文·计算机毕业设计选题·玩具租赁系统
莹雨潇潇5 小时前
Docker 快速入门(Ubuntu版)
java·前端·docker·容器
杨哥带你写代码5 小时前
足球青训俱乐部管理:Spring Boot技术驱动
java·spring boot·后端
郭二哈6 小时前
C++——模板进阶、继承
java·服务器·c++
A尘埃6 小时前
SpringBoot的数据访问
java·spring boot·后端