ribbon方式调用
就是将原来的具体地址,改为了通过服务名去调用。注册中心中有多个服务,相同服务名,就会算作可以调用的服务。
首先得有一个注册中心,然后各种服务注册进去,然后利用ribbon或者feign去调用。
ribbon是直接用地址拼接,然后调用。
feign通过对外编写接口,然后实现接口逻辑,外部消费者调用接口,就类似我又写了一个给其他服务使用的controller,然后去实现具体逻辑。我自己服务的controller是给前端调用的。
先编写给其他服务调用的controller(feign)的api:
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可以有一个负载均衡去调用它。
实现我这个接口的具体逻辑:
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也已经开启了的哦。