2025.1.15 学习
api开放平台
我们希望在后端使用Http请求调用接口,应该怎么做呢
可以用Hutool工具库中的Http请求工具类,使用如下:
public class ApiClient {public String getNameByGet(String name){HashMap<String, Object> paramMap = new HashMap<>();paramMap.put("name", name);String result= HttpUtil.get("http://localhost:8080/api/name/", paramMap);System.out.println(result);return result;}public String getNameByPost(String name) {HashMap<String, Object> paramMap = new HashMap<>();paramMap.put("name", name);String result= HttpUtil.post("http://localhost:8080/api/name/", paramMap);System.out.println(result);return result;}public String getUsernameByPost(User user){String json =JSONUtil.toJsonStr(user);HttpResponse httpResponse = HttpRequest.post("http://localhost:8080/api/name/user").body(json).execute();System.out.println(httpResponse.getStatus());System.out.println(httpResponse.body());return httpResponse.body();}
}
项目开在8080端口,提供了几个接口如下
@RestController
@RequestMapping("/name")
public class NameController {@GetMapping("/")public String getNameByGet(String name){return "GET 你的名字是"+name;}@PostMapping("/")public String getNameByPost(@RequestParam String name){return "POST 你的名字是"+name;}@PostMapping("/user")public String getUserNameByPost(@RequestBody User user){return "POST 你的名字是"+user.getUsername();}
}
八股
@Autowired
注解和@Resouce
注解
首先Spring官方是推荐@Autowired注解的,但是我们在idea中使用@Autowired注解,会有黄色波浪线,显示Field injection is not recommended。所以在项目中我们一般使用@Resource注解来进行依赖注入
接下来我们说一下二者的区别
-
@Autowired注解是按照类型方式自动装配,如果有多个同类型的Bean,则需要通过@Qualifier指定具体的Bean。
-
@Resource注解是Java自带的注入方式,按照名称自动装配,默认是按照属性名称进行匹配,如果需要按照Bean的名称进行匹配,可以使用@Resource(name="beanName")
我们来试一下@Autowired注解找到两个可以注入的Bean会怎样
@RestController
@RequestMapping("/autowired")
public class TestAutowiredController {@Autowiredprivate TestAutowired testAutowiredService;@RequestMapping("/test")public void test(){testAutowiredService.AutoWiredTest();}
}//TestAutowired接口
public interface TestAutowired {String AutoWiredTest();}
//实现类1
@Service
public class TestAutowiredImpl1 implements TestAutowired {@Overridepublic String AutoWiredTest() {System.out.println("实现1");return null;}
}
//实现类2
@Service
public class TestAutowiredImpl2 implements TestAutowired {@Overridepublic String AutoWiredTest() {System.out.println("实现2");return null;}
}
报错如下:
Redis主从复制
Redis 的主从复制是指一个 Redis 实例(主节点)可以将数据复制到一个或多个从节点(从节点)),从节点从主节点获取数据并保持同步
流程
开始同步:从节点通过向主节点发送 PSYNC命令发起同步。
全量复制:如果是第一次连接或之前的连接失效,从节点会请求全量复制,主节点将当前数据快照(RDB文件)发送给从节点。
增量复制:
情况一:全量复制完毕后,主从之间会保持一个长连接,主节点会通过这个连接将后续的写操作传递给从节点执行,来保证数据的一致。
情况二:主从之间的网络可能不稳定,如果连接断开,主节点部分写操作未传递给从节点执行,主从数据就不一致了。此时有一种选择是再次发起全量同步,但是全量同步数据量比较大,非常耗时。因此 Redis 在 2.8 版本引入了增量同步(psync
其实就是 2.8引入的命令)仅需把连接断开其间的数据同步给从节点就好了。此时需要介绍下 repl_backlog_buffer
。repl_backlog_buffer
是一个环形缓冲区,默认大小为1m。主节点会将写入命令存到这个缓冲区中,但是大小有限,待写入的命令超过 1m 后,会覆盖之前的数据,因为是环形写入。增量同步也是 psync 命令,如果主节点判断从节点传递的 runid
和主节点一致,且根据 offset 判断数据还在repl_backlog_buffer
中,则说明可以进行增量同步。于是就去 repl_backlog_buffer
查找对应 offset之后的命令数据,写入到replication buffer中,最终将其发送给 slave节点。slave 节点收到指令之后执行对应的命令,一次增量同步的过程就完成了。
综上,我们也可以总结一下replication buffer和repl_backlog_buffer
之间的区别。replication呢是主节点对应每个从节点都有的一块区域,用于在长连接过程中实时传输写命令,而repl_backlog_buffer
在主节点上只有一个,存储最近的写命令,用于从服务器重新连接时的部分重同步。