OpenFeign内部调用二
4.修改各业务服务的调用代码为feignClient
开启nacos注册 把Client变成bean
该服务仅内部调用,不是给前端的
将某个服务标记为“内部调用”的目的主要有以下几个方面:
-
安全性: 内部API通常不对外部用户公开,这样可以防止未授权的访问。通过限制只允许内部服务调用,可以降低潜在的安全风险。
-
服务架构: 在微服务架构中,服务之间的通信往往是通过内部API进行的。这种设计使得各个服务能相互协作,同时避免了直接暴露给外部的复杂性。
-
性能优化: 内部调用通常可以优化网络请求,例如使用轻量级的通信协议(如gRPC或HTTP/2),而不是传统的RESTful API,这样可以提高性能。
-
版本控制: 内部API可以独立于外部API进行版本控制,使得内部服务能够在不影响外部用户的情况下进行更新和迭代。
-
简化开发: 开发人员可以在内部API中使用更复杂的逻辑和数据结构,而不需要考虑外部用户的兼容性问题。
-
监控与日志: 内部调用可以更方便地进行监控和日志记录,以便于分析和调试内部服务之间的交互。
通过这些措施,可以确保系统的稳定性和安全性,同时提升开发效率和服务可维护性。
编写服务的实现类 注意要和之前定义的客户端保持一致
这服务只是内部调用的
package com.yupi.yuojbackenduserservice.controller.inner;
import com.yupi.yuojbackendmodel.model.entity.User;
import com.yupi.yuojbackendserviceclient.service.UserFeignClient;
import com.yupi.yuojbackenduserservice.service.UserService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.Collection;
import java.util.List;
/**
* 该服务仅内部调用,不是给前端的
*/
@RestController
@RequestMapping("/inner")
public class UserInnerController implements UserFeignClient {
@Resource
private UserService userService;
/**
* 根据 id 获取用户
* @param userId
* @return
*/
@Override
@GetMapping("/get/id")
public User getById(@RequestParam("userId") long userId) {
return userService.getById(userId);
}
/**
* 根据 id 获取用户列表
* @param idList
* @return
*/
@Override
@GetMapping("/get/ids")
public List<User> listByIds(@RequestParam("idList") Collection<Long> idList) {
return userService.listByIds(idList);
}
}
什么时候用Client呢
5.开启nacos的配置 让服务互相发现
注册配置中心
现在所有服务引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
每个服务都配置一下
是针对 Spring Cloud 使用 Nacos 作为服务发现的设置
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
给项目启动类打上注解
开启服务发现
找到对应客户端Bean的位置
这边建议的是给每个服务都加上
@EnableDiscoveryClient
@EnableFeignClients(basePackages = {"com.yupi.yuojbackendserviceclient.service"})
全局要引入负载均衡器依赖
主要功能包括:
-
客户端负载均衡:根据策略(如轮询、随机等)将请求分发到不同的服务实例。
-
与 Spring Cloud 生态系统的集成:可以与其他 Spring Cloud 组件(如 Eureka、Consul 等)一起使用,以实现服务发现和负载均衡。
-
自定义负载均衡策略:支持用户定义自己的负载均衡算法。
使用场景:
-
在微服务架构中,多个服务实例提供相同的功能时,可以通过负载均衡器将请求合理分配到这些实例上,以提高可用性和性能。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
<version>3.1.5</version>
</dependency>