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

相关推荐
听风吟丶6 分钟前
Java 9+ 模块化系统(Jigsaw)实战:从 Jar 地狱到模块解耦的架构升级
java·架构·jar
昂子的博客7 分钟前
Redis缓存 更新策略 双写一致 缓存穿透 击穿 雪崩 解决方案... 一篇文章带你学透
java·数据库·redis·后端·spring·缓存
百***68829 分钟前
SpringBoot中Get请求和POST请求接收参数详解
java·spring boot·spring
百***416623 分钟前
Java MySQL 连接
java·mysql·adb
Jayden28 分钟前
synchronized全解析:从锁升级到性能优化,彻底掌握Java内置锁
java·synchronized·synchronized面试·synchronized扫盲
任子菲阳1 小时前
学Java第四十五天——斗地主小游戏创作
java·开发语言·windows
czhc11400756631 小时前
Java1112 基类 c#vscode使用 程序结构
android·java·数据库
嫂子的姐夫1 小时前
23-MD5+DES+Webpack:考试宝
java·爬虫·python·webpack·node.js·逆向
缪懿1 小时前
JavaEE:多线程基础,多线程的创建和用法
java·开发语言·学习·java-ee
Chan161 小时前
Java 集合面试核心:ArrayList/LinkedList 底层数据结构,HashMap扩容机制详解
java·数据结构·spring boot·面试·intellij-idea