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

相关推荐
行百里er11 分钟前
Spring Insight 里如何画出服务拓扑
spring boot·spring cloud·监控
Wang's Blog17 分钟前
Java框架快速入门: Spring Security+OAuth2之核心角色与授权流程
java·spring·github
hai_android27 分钟前
Kotlin Flow combine 源码剖析:一个 Channel 如何优雅合并多条流
android·java·kotlin
caoerzhong36 分钟前
JeeWMS 开源仓库管理系统权限与域验证解析:Java WMS 如何把数据权限管到仓、货主与人
java·python·开源·vue
君顾138 分钟前
西安 24 小时自助健身房系统开发实战指南
java·开发语言·健身房
用户0942485680338 分钟前
第9章:OpenJDK堆分代与 Serial/Parallel GC 基础
java·jvm
Wang's Blog1 小时前
Java框架快速入门: Spring Security+OAuth2之RBAC与角色分层实践
java·网络·spring
caoerzhong1 小时前
JeeWMS 开源仓库管理系统多租户架构解析:一套 Java WMS 如何同时服务多个货主与多个仓库
java·架构·开源·vue
sunshine22 girl1 小时前
Java学习四 面向对象原理
java
干到60岁退休的码农1 小时前
15.创建获取用户接口与JWT认证器
java·spring boot·mybatis