目录
服务调用
在SpringCloud体系中,所有微服务间的通信都是通过Feign进行调用,Feign是一个http请求调用的轻量级框架,可以以Java接口注解的方式调用Http请求,而不用像使用HttpClient、OKHttp3等组件通过封装HTTP请求报文的方式调用。Feign通过处理注解,将请求模板化,当实际调用的时候,传入参数,根据参数再应用到请求上,进而转化成真正的请求,这种请求相对而言比较直观。而且Feign默认集成了负载均衡器Ribbon,不需要自己实现负载均衡逻辑。
Openfeign远程调用
Feign使用Ribbon作为负载均衡
Openfeign使用Loadbalance作为负载均衡
编辑配置 勾上允许允许多个实例
先启动一个8081
更改yaml的端口号后再启动
便可启动2个不同端口的同一实例
可以看到除了端口不一致外其它都一致
统一返回类型
Java接口统一返回数据类型_你蠢哭了我的博客-CSDN博客
account-service controller
package com.kuang.account.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.kuang.account.service.AccountService;
import com.kuang.common.entity.Account;
import com.kuang.common.exception.BusinessException;
import com.kuang.common.response.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* <p>
* 前端控制器
* </p>
*
* @author HaiGee
* @since 2022-06-16
*/
@RestController
@RequestMapping("/account")
public class AccountController {
@Autowired
AccountService accountService
@GetMapping("/getAccountList")
public Result getAccountList(){
List<Account> list = accountService.list();
return Result.ok().data("list",list);
}
}
远程调用
user-service
pom.xml 配置
<dependencies>
<dependency>
<groupId>org.example</groupId>
<artifactId>common-service</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--引入服务注册与发现的依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2021.1</version>
</dependency>
<!--引入远程调用的依赖openfeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--openfeign默认使用loadbalancer负载均衡器-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
</dependencies>
用户需要调用账户的服务
那么账户需要提供Openfeign调用的接口
UserApplication 添加 @EnableFeignClients 注解
package com.kuang.user;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
//开启feign的远程调用服务
@EnableFeignClients
@SpringBootApplication
@EnableDiscoveryClient
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class,args);
}
}
account-service controller新增一个接口
package com.kuang.account.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.kuang.account.service.AccountService;
import com.kuang.common.entity.Account;
import com.kuang.common.exception.BusinessException;
import com.kuang.common.response.Result;
import com.kuang.common.response.ResultCode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* <p>
* 前端控制器
* </p>
*
* @author HaiGee
* @since 2022-06-16
*/
@RestController
@RequestMapping("/account")
public class AccountController {
@Autowired
AccountService accountService;
@Value("${server.port}")
private String port;
@GetMapping("/getAccountList")
public Result getAccountList(){
List<Account> list = accountService.list();
return Result.ok().data("list",list);
}
@GetMapping("/getAccountByUserId/{id}")
public Result getAccountByUserId(@PathVariable("id")Integer id){
LambdaQueryWrapper<Account> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(Account::getId,id);
Account account = accountService.getOne(wrapper);
if(account==null)
{
throw new BusinessException(ResultCode.USER_ACCOUNT_NOT_EXIST.getCode(),
ResultCode.USER_ACCOUNT_NOT_EXIST.getMessage());
}
return Result.ok().data("account",account).data("port",port);
}
}
user-service feign下创建 账单远程服务类
package com.kuang.user.feign;
import com.kuang.common.response.Result;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
/**
* 功能描述: <br>
* 用户调用账单的远程服务
* @Param:
* @Return:
* @Author: Mr.Kuang
* @Date: ${Date} ${Time}*/
@FeignClient("account-service")
public interface AccountFeign {
@GetMapping("/account/getAccountByUserId/{id}")
Result getAccountByUserId(@PathVariable("id")Integer id);
}
用户调用账户 被调用者 (账户) 要提供多个服务
测试负载均衡是否生效
仅开启一个用户服务与两个账单服务进行测试
反复刷新观察端口号变化