Merge branch 'gitee'
This commit is contained in:
commit
0fb05d4461
71
ForJdk17/src/main/java/cn/whaifree/leetCode/LeetCode283.java
Normal file
71
ForJdk17/src/main/java/cn/whaifree/leetCode/LeetCode283.java
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
package cn.whaifree.leetCode;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @version 1.0
|
||||||
|
* @Author whai文海
|
||||||
|
* @Date 2024/11/1 14:24
|
||||||
|
* @注释
|
||||||
|
*/
|
||||||
|
public class LeetCode283 {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test() {
|
||||||
|
int[] nums = {0, 4, 0, 3, 12, 0};
|
||||||
|
new Solution().moveZeroes(nums);
|
||||||
|
for (int num : nums) {
|
||||||
|
System.out.print(num + " ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class Solution {
|
||||||
|
public void moveZeroes(int[] nums) {
|
||||||
|
|
||||||
|
|
||||||
|
for (int i = 1; i < nums.length; i++) {
|
||||||
|
// 插入排序
|
||||||
|
for (int j = i; j > 0; j--) {
|
||||||
|
if (nums[j - 1] == 0) {
|
||||||
|
swap(nums, j, j - 1);
|
||||||
|
} else if (nums[j] != 0 && nums[j - 1] == 0) { // 遇到非0就往前插入
|
||||||
|
swap(nums, j, j - 1);
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void swap(int[] nums, int i, int j) {
|
||||||
|
int temp = nums[i];
|
||||||
|
nums[i] = nums[j];
|
||||||
|
nums[j] = temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test1() {
|
||||||
|
int[] nums = {0, 4, 0, 3, 12, 0};
|
||||||
|
new Solution1().moveZeroes(nums);
|
||||||
|
for (int num : nums) {
|
||||||
|
System.out.print(num + " ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class Solution1 {
|
||||||
|
public void moveZeroes(int[] nums) {
|
||||||
|
int left = 0;
|
||||||
|
for (int i = 0; i < nums.length; i++) {
|
||||||
|
if (nums[i] != 0) {
|
||||||
|
nums[left] = nums[i];
|
||||||
|
left++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (int i = left; i < nums.length; i++) {
|
||||||
|
nums[i] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
96
ForJdk17/src/main/java/cn/whaifree/leetCode/LeetCode560.java
Normal file
96
ForJdk17/src/main/java/cn/whaifree/leetCode/LeetCode560.java
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
package cn.whaifree.leetCode;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @version 1.0
|
||||||
|
* @Author whai文海
|
||||||
|
* @Date 2024/11/1 15:17
|
||||||
|
* @注释
|
||||||
|
*/
|
||||||
|
public class LeetCode560 {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test() {
|
||||||
|
int[] nums = {-1, -1, 1};
|
||||||
|
int k = 0;
|
||||||
|
|
||||||
|
int res = new Solution().subarraySum(nums, k);
|
||||||
|
System.out.println(res);
|
||||||
|
}
|
||||||
|
|
||||||
|
class Solution {
|
||||||
|
/**
|
||||||
|
* -2 -5 1 2
|
||||||
|
*
|
||||||
|
* -2 -7 -6 -4
|
||||||
|
* 子数组(连续)的个数 。
|
||||||
|
*
|
||||||
|
* 前缀和,前缀和的区间总面积为k的个数
|
||||||
|
*
|
||||||
|
* @param nums
|
||||||
|
* @param k
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public int subarraySum(int[] nums, int k) {
|
||||||
|
int len = nums.length;
|
||||||
|
|
||||||
|
int[] preSum = new int[len + 1];
|
||||||
|
for (int i = 0; i < len; i++) {
|
||||||
|
preSum[i + 1] = preSum[i] + nums[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int count = 0;
|
||||||
|
for (int left = 0; left < len; left++) {
|
||||||
|
for (int right = left; right < len; right++) {
|
||||||
|
// 区间和 [left..right],注意下标偏移
|
||||||
|
if (preSum[right + 1] - preSum[left] == k) {
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 子数组(连续)的个数 。
|
||||||
|
*
|
||||||
|
* 前缀和,前缀和的区间总面积为k的个数
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 1. 每次计算的元素n,在前面计算好前缀和,只要找到k-n的前缀和的个数
|
||||||
|
* --- 计算每个前缀和的数量,
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @param nums
|
||||||
|
* @param k
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public int subarraySum1(int[] nums, int k) {
|
||||||
|
Map<Integer, Integer> map = new HashMap<>();
|
||||||
|
map.put(0, 1);
|
||||||
|
// map为各种前缀和的数量
|
||||||
|
int preSum = 0;
|
||||||
|
int res = 0;
|
||||||
|
for (int num : nums) {
|
||||||
|
preSum += num;
|
||||||
|
// 画图,就是一个大的面积,找到小的面积,取其中的差值区域;即找到一个范围==k
|
||||||
|
// | preSum-k | k |
|
||||||
|
// 整个是preSum
|
||||||
|
// PreSum当前的前缀和-某个之前的前缀和=k,而map存储之前前缀和k的个数为v个
|
||||||
|
if (map.containsKey(preSum - k)) {
|
||||||
|
res += map.get(preSum - k);
|
||||||
|
}
|
||||||
|
map.put(preSum, map.getOrDefault(preSum, 0) + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return res;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,45 @@
|
|||||||
|
package cn.whaifree.redo.redo_all_241016;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @version 1.0
|
||||||
|
* @Author whai文海
|
||||||
|
* @Date 2024/11/1 14:08
|
||||||
|
* @注释
|
||||||
|
*/
|
||||||
|
public class LeetCode1005 {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test() {
|
||||||
|
int[] nums = {4,-5,4,-5,9,4,5};
|
||||||
|
int k = 1;
|
||||||
|
int result = new Solution().largestSumAfterKNegations(nums, k);
|
||||||
|
System.out.println(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
class Solution {
|
||||||
|
public int largestSumAfterKNegations(int[] nums, int k) {
|
||||||
|
Arrays.sort(nums);
|
||||||
|
|
||||||
|
int res = 0;
|
||||||
|
int minAbs = Integer.MAX_VALUE;
|
||||||
|
for (int i = 0; i < nums.length; i++) {
|
||||||
|
if (nums[i] < 0 && k > 0) {
|
||||||
|
nums[i] = -nums[i];
|
||||||
|
k--;
|
||||||
|
}
|
||||||
|
minAbs = Math.min(minAbs, nums[i]);
|
||||||
|
res += nums[i];
|
||||||
|
}
|
||||||
|
if (k % 2 == 0) {
|
||||||
|
// 偶数
|
||||||
|
return res;
|
||||||
|
}else {
|
||||||
|
return res - minAbs * 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,48 @@
|
|||||||
|
package cn.whaifree.redo.redo_all_241016;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @version 1.0
|
||||||
|
* @Author whai文海
|
||||||
|
* @Date 2024/10/31 12:03
|
||||||
|
* @注释
|
||||||
|
*/
|
||||||
|
public class LeetCode123 {
|
||||||
|
|
||||||
|
class Solution {
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* dp[1] 表示手里没有第一支股票的最大利润
|
||||||
|
* - 前一天就没 dp[i-1][1]
|
||||||
|
* - 前一天有第一支,今天刚刚卖了 dp[i-1][2] + prices[i]
|
||||||
|
* dp[2] 表示手里有第一支股票的最大利润
|
||||||
|
* - 前一天就有 dp[i-1][2]
|
||||||
|
* - 前一天没有,刚刚买入第一支 dp[i-1][1] - prices[i]
|
||||||
|
*
|
||||||
|
* dp[3] 表示手里没有第二支股票的最大利润
|
||||||
|
*
|
||||||
|
* dp[4] 表示手里有第二支股票的最大利润
|
||||||
|
*
|
||||||
|
* @param prices
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public int maxProfit(int[] prices) {
|
||||||
|
|
||||||
|
int[][] dp = new int[prices.length][5];
|
||||||
|
dp[0][1] = 0;
|
||||||
|
dp[0][2] = -prices[0];
|
||||||
|
dp[0][3] = 0;
|
||||||
|
dp[0][4] = -prices[0];
|
||||||
|
|
||||||
|
for (int i = 1; i < prices.length; i++) {
|
||||||
|
dp[i][2] = Math.max(dp[i - 1][2], dp[i - 1][0] - prices[i]);
|
||||||
|
dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][2] + prices[i]);
|
||||||
|
// 手里有第二支股票的最大利润 前一天就有第二支,【前一天没有第二支,也没有第一支但今天买入】
|
||||||
|
dp[i][4] = Math.max(dp[i - 1][4], dp[i - 1][1] - prices[i]);
|
||||||
|
// 手里没有第二支股票的最大利润 前一天就没有第二支,前一天有第二支但今天卖出
|
||||||
|
dp[i][3] = Math.max(dp[i - 1][3], dp[i - 1][4] + prices[i]);
|
||||||
|
}
|
||||||
|
return dp[prices.length - 1][3];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,87 @@
|
|||||||
|
package cn.whaifree.redo.redo_all_241016;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @version 1.0
|
||||||
|
* @Author whai文海
|
||||||
|
* @Date 2024/10/31 11:28
|
||||||
|
* @注释
|
||||||
|
*/
|
||||||
|
public class LeetCode289 {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test() {
|
||||||
|
int[][] board = new int[][]{{0,1,0},{0,0,1},{1,1,1},{0,0,0}};
|
||||||
|
new Solution().gameOfLife(board);
|
||||||
|
for (int i = 0; i < board.length; i++) {
|
||||||
|
for (int j = 0; j < board[0].length; j++) {
|
||||||
|
System.out.print(board[i][j] + " ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class Solution {
|
||||||
|
/**
|
||||||
|
* 如果活细胞周围八个位置的活细胞数少于两个,则该位置活细胞死亡;1 2
|
||||||
|
* 如果活细胞周围八个位置有两个或三个活细胞,则该位置活细胞仍然存活; 1 1
|
||||||
|
* 如果活细胞周围八个位置有超过三个活细胞,则该位置活细胞死亡;1 2
|
||||||
|
* 如果死细胞周围正好有三个活细胞,则该位置死细胞复活;0 3
|
||||||
|
*
|
||||||
|
* 2 之前是活着,现在死了
|
||||||
|
* 3 之前是死的,现在活了
|
||||||
|
*
|
||||||
|
* 最后遍历吧3变成1,把2变成0
|
||||||
|
*
|
||||||
|
* @param board
|
||||||
|
*/
|
||||||
|
public void gameOfLife(int[][] board) {
|
||||||
|
for (int i = 0; i < board.length; i++) {
|
||||||
|
for (int j = 0; j < board[0].length; j++) {
|
||||||
|
int count = aliveCount(board, i, j);
|
||||||
|
if (board[i][j] == 1) { // 之前是活着的
|
||||||
|
if (count < 2) {
|
||||||
|
board[i][j] = 2;
|
||||||
|
}else if (count > 3) {
|
||||||
|
board[i][j] = 2;
|
||||||
|
}
|
||||||
|
}else {
|
||||||
|
if (count == 3) {
|
||||||
|
board[i][j] = 3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < board.length; i++) {
|
||||||
|
for (int j = 0; j < board[0].length; j++) {
|
||||||
|
if (board[i][j] == 3) {
|
||||||
|
board[i][j] = 1;
|
||||||
|
} else if (board[i][j] == 2) {
|
||||||
|
board[i][j] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public int aliveCount(int[][] board, int i, int j) {
|
||||||
|
int res = 0;
|
||||||
|
for (int ti = i - 1; ti < i + 2; ti++) {
|
||||||
|
for (int tj = j - 1; tj < j + 2; tj++) {
|
||||||
|
if (ti == i && tj == j) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (ti >= 0 && ti < board.length && tj >= 0 && tj < board[0].length) {
|
||||||
|
if (board[ti][tj] == 1 || board[ti][tj] == 2) {
|
||||||
|
res++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,10 @@
|
|||||||
|
package cn.whaifree.redo.redo_all_241016;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @version 1.0
|
||||||
|
* @Author whai文海
|
||||||
|
* @Date 2024/10/31 12:56
|
||||||
|
* @注释
|
||||||
|
*/
|
||||||
|
public class LeetCode468 {
|
||||||
|
}
|
@ -0,0 +1,58 @@
|
|||||||
|
package cn.whaifree.redo.redo_all_241016;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @version 1.0
|
||||||
|
* @Author whai文海
|
||||||
|
* @Date 2024/11/1 13:55
|
||||||
|
* @注释
|
||||||
|
*/
|
||||||
|
public class LeetCode49 {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test() {
|
||||||
|
String[] strs = {"abbbbbbbbbbb","aaaaaaaaaaab"};
|
||||||
|
List<List<String>> result = new Solution().groupAnagrams(strs);
|
||||||
|
for (List<String> list : result) {
|
||||||
|
System.out.println(list);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class Solution {
|
||||||
|
public List<List<String>> groupAnagrams(String[] strs) {
|
||||||
|
|
||||||
|
Map<String, List<String>> map = new HashMap<>();
|
||||||
|
for (int i = 0; i < strs.length; i++) {
|
||||||
|
|
||||||
|
int[] counts = new int[26];
|
||||||
|
String item = strs[i];
|
||||||
|
for (int j = 0; j < item.length(); j++) {
|
||||||
|
counts[item.charAt(j) - 'a']++;
|
||||||
|
}
|
||||||
|
|
||||||
|
StringBuilder str = new StringBuilder();
|
||||||
|
for (int j = 0; j < counts.length; j++) {
|
||||||
|
if (counts[j] != 0) {
|
||||||
|
str.append((char) ('a' + j)).append(counts[j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!map.containsKey(str.toString())) {
|
||||||
|
map.put(str.toString(), new ArrayList<>());
|
||||||
|
}
|
||||||
|
map.get(str.toString()).add(strs[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
List<List<String>> result = new ArrayList<>();
|
||||||
|
for (Map.Entry<String, List<String>> entry : map.entrySet()) {
|
||||||
|
result.add(entry.getValue());
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -33,7 +33,6 @@ public class DynamicThreadPoolController {
|
|||||||
@PostConstruct
|
@PostConstruct
|
||||||
public void init() {
|
public void init() {
|
||||||
|
|
||||||
|
|
||||||
executor = new ThreadPoolExecutor(
|
executor = new ThreadPoolExecutor(
|
||||||
Runtime.getRuntime().availableProcessors(), Runtime.getRuntime().availableProcessors() * 4, 10, TimeUnit.SECONDS,
|
Runtime.getRuntime().availableProcessors(), Runtime.getRuntime().availableProcessors() * 4, 10, TimeUnit.SECONDS,
|
||||||
new ArrayBlockingQueue<>(100),
|
new ArrayBlockingQueue<>(100),
|
||||||
@ -68,6 +67,7 @@ class DynamicThreadPoolConfig implements ApplicationListener<EnvironmentChangeEv
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onApplicationEvent(EnvironmentChangeEvent event) {
|
public void onApplicationEvent(EnvironmentChangeEvent event) {
|
||||||
|
System.out.println("DynamicThreadPoolConfig.onApplicationEvent");
|
||||||
if (event.getKeys().contains("dynamic.coreSize")) {
|
if (event.getKeys().contains("dynamic.coreSize")) {
|
||||||
// 获取值
|
// 获取值
|
||||||
Integer coreSize = threadConfigProperties.getCoreSize();
|
Integer coreSize = threadConfigProperties.getCoreSize();
|
||||||
|
@ -15,7 +15,7 @@ spring:
|
|||||||
# 配置所属命名空间的id,我们配置名称为dev的id,在命名空间列表查看id的值
|
# 配置所属命名空间的id,我们配置名称为dev的id,在命名空间列表查看id的值
|
||||||
namespace: 97ff159f-6177-4aab-b735-bd75458949d4
|
namespace: 97ff159f-6177-4aab-b735-bd75458949d4
|
||||||
# 文件名,如果没有配置则默认为 ${spring.application.name}
|
# 文件名,如果没有配置则默认为 ${spring.application.name}
|
||||||
prefix: springboot3-nacos
|
# prefix: springboot3-nacos
|
||||||
# 配置所属分组
|
# 配置所属分组
|
||||||
group: DEFAULT_GROUP
|
group: DEFAULT_GROUP
|
||||||
# 后缀名,只支持 properties 和 yaml 类型
|
# 后缀名,只支持 properties 和 yaml 类型
|
||||||
@ -24,12 +24,9 @@ spring:
|
|||||||
server-addr: localhost:8848
|
server-addr: localhost:8848
|
||||||
# 配置自动刷新
|
# 配置自动刷新
|
||||||
refresh-enabled: true
|
refresh-enabled: true
|
||||||
|
|
||||||
# 启用远程同步配置
|
|
||||||
enable-remote-sync-config: true
|
|
||||||
config:
|
config:
|
||||||
import:
|
import:
|
||||||
- optional:nacos:${spring.application.name}.${spring.cloud.nacos.config.file-extension}
|
- optional:nacos:springboot3-nacos.${spring.cloud.nacos.config.file-extension}
|
||||||
|
|
||||||
# Logger Config
|
# Logger Config
|
||||||
logging:
|
logging:
|
||||||
|
@ -1,11 +1,25 @@
|
|||||||
package com.whai.springcloud.serviceb.controller;
|
package com.whai.springcloud.serviceb.controller;
|
||||||
|
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
|
import com.alibaba.cloud.nacos.NacosConfigManager;
|
||||||
|
import com.alibaba.nacos.api.config.ConfigService;
|
||||||
|
import com.alibaba.nacos.api.config.listener.Listener;
|
||||||
|
import com.alibaba.nacos.api.exception.NacosException;
|
||||||
|
import com.alibaba.nacos.shaded.com.google.common.util.concurrent.RateLimiter;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.beans.factory.annotation.Qualifier;
|
||||||
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
|
import org.springframework.cloud.context.config.annotation.RefreshScope;
|
||||||
import org.springframework.core.env.Environment;
|
import org.springframework.core.env.Environment;
|
||||||
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.concurrent.Executor;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @version 1.0
|
* @version 1.0
|
||||||
* @Author whai文海
|
* @Author whai文海
|
||||||
@ -13,13 +27,44 @@ import org.springframework.web.bind.annotation.RestController;
|
|||||||
* @注释
|
* @注释
|
||||||
*/
|
*/
|
||||||
@RestController
|
@RestController
|
||||||
|
@RefreshScope
|
||||||
public class BProviderController {
|
public class BProviderController {
|
||||||
|
|
||||||
private final Environment environment;
|
private final Environment environment;
|
||||||
|
|
||||||
|
private RateLimiter rateLimiter;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
public BProviderController(Environment environment) {
|
public BProviderController(Environment environment, @Qualifier("nacosConfigManager") NacosConfigManager nacosConfigManager) {
|
||||||
this.environment = environment;
|
this.environment = environment;
|
||||||
|
initRateLimiter();
|
||||||
|
ConfigService configService = nacosConfigManager.getConfigService();
|
||||||
|
try {
|
||||||
|
configService.addListener("cvm.reset.ratelimit", "DEFAULT_GROUP", new Listener() {
|
||||||
|
@Override
|
||||||
|
public Executor getExecutor() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void receiveConfigInfo(String configInfo) {
|
||||||
|
System.out.println("收到配置变更:cvm.reset.ratelimit" + configInfo);
|
||||||
|
rateLimiter.setRate(Double.parseDouble(configInfo));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} catch (NacosException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
@Value("${cvm.reset.ratelimit}")
|
||||||
|
private int rateLimitCount;
|
||||||
|
private void initRateLimiter() {
|
||||||
|
if (rateLimitCount <= 0) {
|
||||||
|
rateLimitCount = 1;
|
||||||
|
}
|
||||||
|
System.out.println("初始化限流器:" + rateLimitCount);
|
||||||
|
rateLimiter = RateLimiter.create(rateLimitCount);
|
||||||
}
|
}
|
||||||
// 提供服务
|
// 提供服务
|
||||||
@RequestMapping("/getB")
|
@RequestMapping("/getB")
|
||||||
@ -28,4 +73,20 @@ public class BProviderController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@PostMapping("/CVM/reset")
|
||||||
|
public String reset(@RequestBody List<String> InstanceIds) {
|
||||||
|
System.out.println("当前限流数:" + rateLimiter.getRate());
|
||||||
|
List<String> succ = new ArrayList<>();
|
||||||
|
for (String instanceId : InstanceIds) {
|
||||||
|
if (rateLimiter.tryAcquire()) {
|
||||||
|
// 处理重置请求
|
||||||
|
succ.add(instanceId);
|
||||||
|
}else {
|
||||||
|
return "请求过于频繁,请稍后重试";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return StrUtil.format("重置成功,成功实例:{}", succ);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
|
|
||||||
spring:
|
spring:
|
||||||
|
|
||||||
application:
|
application:
|
||||||
name: ServiceB
|
name: ServiceB
|
||||||
cloud:
|
cloud:
|
||||||
@ -12,23 +11,21 @@ spring:
|
|||||||
group: DEFAULT_GROUP
|
group: DEFAULT_GROUP
|
||||||
server-addr: localhost:8848
|
server-addr: localhost:8848
|
||||||
config:
|
config:
|
||||||
# ?????????id????????dev?id??????????id??
|
# 配置所属命名空间的id,我们配置名称为dev的id,在命名空间列表查看id的值
|
||||||
namespace: 97ff159f-6177-4aab-b735-bd75458949d4
|
namespace: 97ff159f-6177-4aab-b735-bd75458949d4
|
||||||
# ?????????????? ${spring.application.name}
|
# 文件名,如果没有配置则默认为 ${spring.application.name}
|
||||||
# prefix: springboot3-nacos
|
# prefix: springboot3-nacos
|
||||||
# ??????
|
# 配置所属分组
|
||||||
group: DEFAULT_GROUP
|
group: DEFAULT_GROUP
|
||||||
# ??????? properties ? yaml ??
|
# 后缀名,只支持 properties 和 yaml 类型
|
||||||
file-extension: yaml
|
file-extension: yaml
|
||||||
# nacos?????
|
# nacos服务器地址
|
||||||
server-addr: localhost:8848
|
server-addr: localhost:8848
|
||||||
# ??????
|
# 配置自动刷新
|
||||||
refresh-enabled: true
|
refresh-enabled: true
|
||||||
# ????????
|
|
||||||
enable-remote-sync-config: true
|
|
||||||
config:
|
config:
|
||||||
import:
|
import:
|
||||||
- optional:nacos:${spring.application.name}.${spring.cloud.nacos.config.file-extension}
|
- optional:nacos:springboot3-nacos.${spring.cloud.nacos.config.file-extension}
|
||||||
|
|
||||||
# Logger Config
|
# Logger Config
|
||||||
logging:
|
logging:
|
||||||
@ -37,4 +34,3 @@ logging:
|
|||||||
|
|
||||||
hexadecimal:
|
hexadecimal:
|
||||||
name: whai
|
name: whai
|
||||||
# --server.port=12139
|
|
||||||
|
@ -31,6 +31,13 @@
|
|||||||
<spring-cloud.version>2023.0.3</spring-cloud.version>
|
<spring-cloud.version>2023.0.3</spring-cloud.version>
|
||||||
</properties>
|
</properties>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
|
<!-- Lombok -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.projectlombok</groupId>
|
||||||
|
<artifactId>lombok</artifactId>
|
||||||
|
<version>1.18.30</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
<!--hutool-->
|
<!--hutool-->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>cn.hutool</groupId>
|
<groupId>cn.hutool</groupId>
|
||||||
|
@ -38,14 +38,8 @@
|
|||||||
<!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter -->
|
<!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.baomidou</groupId>
|
<groupId>com.baomidou</groupId>
|
||||||
<artifactId>mybatis-plus-boot-starter</artifactId>
|
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
|
||||||
<version>3.5.1</version>
|
<version>3.5.9</version>
|
||||||
</dependency>
|
|
||||||
<!--mybatis-->
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.mybatis.spring.boot</groupId>
|
|
||||||
<artifactId>mybatis-spring-boot-starter</artifactId>
|
|
||||||
<version>3.0.2</version>
|
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.github.xiaoymin</groupId>
|
<groupId>com.github.xiaoymin</groupId>
|
||||||
|
@ -0,0 +1,16 @@
|
|||||||
|
package cn.whaifree.springdemo.config;
|
||||||
|
|
||||||
|
import org.mybatis.spring.annotation.MapperScan;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @version 1.0
|
||||||
|
* @Author whai文海
|
||||||
|
* @Date 2024/11/1 12:41
|
||||||
|
* @注释
|
||||||
|
*/
|
||||||
|
@Configuration
|
||||||
|
@MapperScan("cn.whaifree.springdemo.mybatis.mapper")
|
||||||
|
public class MybatisConfig {
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,138 @@
|
|||||||
|
//package cn.whaifree.springdemo.tech;
|
||||||
|
//
|
||||||
|
//import jakarta.annotation.Resource;
|
||||||
|
//import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
//import org.springframework.context.annotation.AnnotationConfigApplicationContext;
|
||||||
|
//import org.springframework.context.annotation.Lazy;
|
||||||
|
//import org.springframework.context.annotation.Scope;
|
||||||
|
//import org.springframework.stereotype.Component;
|
||||||
|
//
|
||||||
|
///**
|
||||||
|
// * @version 1.0
|
||||||
|
// * @Author whai文海
|
||||||
|
// * @Date 2024/10/31 13:57
|
||||||
|
// * @注释
|
||||||
|
// */
|
||||||
|
//public class CircleRelation {
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//// ================================================================
|
||||||
|
//
|
||||||
|
//@Component
|
||||||
|
////@Scope("prototype")
|
||||||
|
//class A1{
|
||||||
|
//// @Resource
|
||||||
|
//// public B1 b1;
|
||||||
|
//
|
||||||
|
// public static void main(String[] args) {
|
||||||
|
// AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext("cn.whaifree.springdemo.tech");
|
||||||
|
//// A1 bean = context.getBean(A1.class);
|
||||||
|
//// System.out.println(bean.b1.a1);
|
||||||
|
//
|
||||||
|
//// LazyA1 lazyA1 = context.getBean(LazyA1.class);
|
||||||
|
//// System.out.println(lazyA1.b1);
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
///**
|
||||||
|
// * BeanCurrentlyInCreationException:
|
||||||
|
// * Error creating bean with name 'a1':
|
||||||
|
// * Requested bean is currently in creation: Is there an unresolvable circular reference?
|
||||||
|
// *
|
||||||
|
// * A 实例创建后,populateBean 时,会触发 B 的加载。
|
||||||
|
// * B 实例创建后,populateBean 时,会触发 A 的加载。由于 A 的 scope=prototype,需要的时候都会创建一个全新的 A。
|
||||||
|
// * 这样,就会进入一个死循环。Spring 肯定是解决不了这种情况下的循环依赖的。所以,提前进行了 check,并抛出了异常。
|
||||||
|
// *
|
||||||
|
// * A需要一个新的B,B需要一个新的A,不能用为初始化的A活着B
|
||||||
|
// */
|
||||||
|
//@Component
|
||||||
|
////@Scope("prototype")
|
||||||
|
//class B1{
|
||||||
|
// @Resource
|
||||||
|
// public A1 a1;
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//@Component
|
||||||
|
//@Scope("prototype")
|
||||||
|
//class LazyA1{
|
||||||
|
//
|
||||||
|
// @Autowired
|
||||||
|
// @Lazy
|
||||||
|
// public LazyB1 b1;
|
||||||
|
//}
|
||||||
|
///**
|
||||||
|
// *
|
||||||
|
// */
|
||||||
|
//@Component
|
||||||
|
//@Scope("prototype")
|
||||||
|
//class LazyB1{
|
||||||
|
// @Autowired
|
||||||
|
// public LazyA1 a1;
|
||||||
|
//}
|
||||||
|
//// ================================================================
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//@Component
|
||||||
|
//class ConstructA {
|
||||||
|
// ConstructB b;
|
||||||
|
// public ConstructA(@Lazy ConstructB b) {
|
||||||
|
// this.b = b;
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
//@Component
|
||||||
|
//class ConstructB {
|
||||||
|
// ConstructA a;
|
||||||
|
// public ConstructB(ConstructA a) {
|
||||||
|
// this.a = a;
|
||||||
|
// }
|
||||||
|
// public static void main(String[] args) {
|
||||||
|
// /**
|
||||||
|
// * A 实例在创建时(createBeanInstance),由于是构造注入,这时会触发 B 的加载。
|
||||||
|
// * B 实例在创建时(createBeanInstance),又会触发 A 的加载,此时,A 还没有添加到三级缓存(工厂)中,所以就会创建一个全新的 A。
|
||||||
|
// * 这样,就会进入一个死循环。Spring 是解决不了这种情况下的循环依赖的。所以,提前进行了 check,并抛出了异常。
|
||||||
|
// *
|
||||||
|
// * 解决:@Lazy放在构造器上,这样,A 实例在创建时,不会触发 B 的加载。
|
||||||
|
// *
|
||||||
|
// * 构造函数注入要求在创建bean实例时必须提供所有依赖
|
||||||
|
// *
|
||||||
|
// */
|
||||||
|
// AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext("cn.whaifree.springdemo.tech");
|
||||||
|
// ConstructA bean = context.getBean(ConstructA.class);
|
||||||
|
// System.out.println(bean.b);
|
||||||
|
// // Unsatisfied dependency expressed through constructor parameter 0:
|
||||||
|
// // Error creating bean with name 'constructA': Requested bean is currently in creation: Is there an unresolvable circular reference?
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//@Component
|
||||||
|
//class SetA {
|
||||||
|
// SetB b;
|
||||||
|
//
|
||||||
|
// @Autowired
|
||||||
|
// public void setB(SetB b) {
|
||||||
|
// this.b = b;
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
//@Component
|
||||||
|
//class SetB {
|
||||||
|
//
|
||||||
|
// SetA a;
|
||||||
|
//
|
||||||
|
// @Autowired
|
||||||
|
// public void setA(SetA a) {
|
||||||
|
// this.a = a;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// public static void main(String[] args) {
|
||||||
|
//
|
||||||
|
// AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext("cn.whaifree.springdemo.tech");
|
||||||
|
// SetA bean = context.getBean(SetA.class);
|
||||||
|
// System.out.println(bean.b);
|
||||||
|
// }
|
||||||
|
//}
|
@ -40,8 +40,6 @@ spring:
|
|||||||
direct:
|
direct:
|
||||||
acknowledge-mode: manual
|
acknowledge-mode: manual
|
||||||
|
|
||||||
mybatis:
|
|
||||||
mapper-locations: '"classpath:/mapper/**.xml"'
|
|
||||||
mybatis-plus:
|
mybatis-plus:
|
||||||
configuration:
|
configuration:
|
||||||
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
|
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
|
||||||
@ -49,6 +47,7 @@ mybatis-plus:
|
|||||||
db-config:
|
db-config:
|
||||||
logic-delete-field: 1
|
logic-delete-field: 1
|
||||||
logic-not-delete-value: 0
|
logic-not-delete-value: 0
|
||||||
|
mapper-locations: "classpath:/mapper/**.xml"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -0,0 +1,34 @@
|
|||||||
|
package cn.whaifree.springdemo.MybatisTest;
|
||||||
|
|
||||||
|
import cn.whaifree.springdemo.mybatis.domain.Orders;
|
||||||
|
import cn.whaifree.springdemo.mybatis.mapper.OrdersMapper;
|
||||||
|
import cn.whaifree.springdemo.mybatis.service.OrdersService;
|
||||||
|
import jakarta.annotation.Resource;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.springframework.boot.test.context.SpringBootTest;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @version 1.0
|
||||||
|
* @Author whai文海
|
||||||
|
* @Date 2024/11/1 12:43
|
||||||
|
* @注释
|
||||||
|
*/
|
||||||
|
@SpringBootTest
|
||||||
|
public class MybatisTest {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private OrdersService ordersService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private OrdersMapper ordersMapper;
|
||||||
|
@Test
|
||||||
|
public void test() {
|
||||||
|
|
||||||
|
List<Orders> orders = ordersMapper.selectList(null);
|
||||||
|
System.out.println(orders);
|
||||||
|
List<Orders> orders1 = ordersMapper.selectByExample();
|
||||||
|
System.out.println(orders1);
|
||||||
|
}
|
||||||
|
}
|
2
pom.xml
2
pom.xml
@ -7,7 +7,7 @@
|
|||||||
<groupId>org.example</groupId> <!--groupId表示当前 Maven 项目隶属的组织或公司-->
|
<groupId>org.example</groupId> <!--groupId表示当前 Maven 项目隶属的组织或公司-->
|
||||||
<artifactId>LeetCode</artifactId> <!--当前 Maven 项目的名称-->
|
<artifactId>LeetCode</artifactId> <!--当前 Maven 项目的名称-->
|
||||||
<version>1.0-SNAPSHOT</version><!--定义了 Maven 项目当前所处版本-->
|
<version>1.0-SNAPSHOT</version><!--定义了 Maven 项目当前所处版本-->
|
||||||
<packaging>pom</packaging>
|
<packaging>jar</packaging>
|
||||||
<modules>
|
<modules>
|
||||||
<module>ForJdk8</module>
|
<module>ForJdk8</module>
|
||||||
<module>ForJdk17</module>
|
<module>ForJdk17</module>
|
||||||
|
Loading…
Reference in New Issue
Block a user