Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Kwan的解忧杂货铺@新空间代码工作室
SpringCloudAlibaba
提交
c64081ad
S
SpringCloudAlibaba
项目概览
Kwan的解忧杂货铺@新空间代码工作室
/
SpringCloudAlibaba
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
S
SpringCloudAlibaba
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
c64081ad
编写于
2月 15, 2023
作者:
Kwan的解忧杂货铺@新空间代码工作室
🐭
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix:网关服务
上级
8e02153b
变更
11
隐藏空白更改
内联
并排
Showing
11 changed file
with
484 addition
and
10 deletion
+484
-10
nacos-server-gateway/pom.xml
nacos-server-gateway/pom.xml
+89
-0
nacos-server-gateway/src/main/java/com/kwan/springcloudalibaba/GatewayApplication.java
.../java/com/kwan/springcloudalibaba/GatewayApplication.java
+40
-0
nacos-server-gateway/src/main/java/com/kwan/springcloudalibaba/constant/RespConstant.java
...va/com/kwan/springcloudalibaba/constant/RespConstant.java
+6
-0
nacos-server-gateway/src/main/java/com/kwan/springcloudalibaba/controller/FlowLimitController.java
...an/springcloudalibaba/controller/FlowLimitController.java
+120
-0
nacos-server-gateway/src/main/java/com/kwan/springcloudalibaba/controller/LocalController.java
...m/kwan/springcloudalibaba/controller/LocalController.java
+52
-0
nacos-server-gateway/src/main/java/com/kwan/springcloudalibaba/controller/SentinelController.java
...wan/springcloudalibaba/controller/SentinelController.java
+70
-0
nacos-server-gateway/src/main/java/com/kwan/springcloudalibaba/handler/UrlBlockHandler.java
.../com/kwan/springcloudalibaba/handler/UrlBlockHandler.java
+47
-0
nacos-server-gateway/src/main/resources/bootstrap.yml
nacos-server-gateway/src/main/resources/bootstrap.yml
+34
-0
nacos-server-gateway/src/test/java/com/kwan/springcloudalibaba/SentinelConsumerApplicationTests.java
.../springcloudalibaba/SentinelConsumerApplicationTests.java
+13
-0
nacos-server-sentinel-consumer/src/main/resources/bootstrap.yml
...server-sentinel-consumer/src/main/resources/bootstrap.yml
+5
-3
pom.xml
pom.xml
+8
-7
未找到文件。
nacos-server-gateway/pom.xml
0 → 100644
浏览文件 @
c64081ad
<?xml version="1.0" encoding="UTF-8"?>
<project
xmlns=
"http://maven.apache.org/POM/4.0.0"
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"
>
<modelVersion>
4.0.0
</modelVersion>
<parent>
<groupId>
com.kwan.springcloudalibaba
</groupId>
<artifactId>
nacos-server-parent
</artifactId>
<version>
1.0.0-SNAPSHOT
</version>
</parent>
<artifactId>
nacos-server-gateway
</artifactId>
<name>
nacos-server-gateway
</name>
<description>
nacos-server-gateway
</description>
<dependencies>
<dependency>
<groupId>
com.kwan.springcloudalibaba
</groupId>
<artifactId>
nacos-server-feign-api
</artifactId>
<version>
1.0.0-SNAPSHOT
</version>
</dependency>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-web
</artifactId>
</dependency>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-test
</artifactId>
<scope>
test
</scope>
</dependency>
<dependency>
<groupId>
com.alibaba.cloud
</groupId>
<artifactId>
spring-cloud-starter-alibaba-nacos-discovery
</artifactId>
</dependency>
<dependency>
<groupId>
com.alibaba.cloud
</groupId>
<artifactId>
spring-cloud-starter-alibaba-nacos-config
</artifactId>
</dependency>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-actuator
</artifactId>
</dependency>
<dependency>
<groupId>
org.projectlombok
</groupId>
<artifactId>
lombok
</artifactId>
</dependency>
<dependency>
<groupId>
com.alibaba.csp
</groupId>
<artifactId>
sentinel-core
</artifactId>
</dependency>
<!-- 客户端需要引入 Transport 模块来与 Sentinel 控制台进行通信-->
<dependency>
<groupId>
com.alibaba.csp
</groupId>
<artifactId>
sentinel-transport-simple-http
</artifactId>
</dependency>
<!--sentinel启动器-->
<dependency>
<groupId>
com.alibaba.cloud
</groupId>
<artifactId>
spring-cloud-starter-alibaba-sentinel
</artifactId>
</dependency>
<!--sentinel持久化存储-->
<dependency>
<groupId>
com.alibaba.csp
</groupId>
<artifactId>
sentinel-datasource-nacos
</artifactId>
</dependency>
<dependency>
<groupId>
junit
</groupId>
<artifactId>
junit
</artifactId>
</dependency>
<dependency>
<groupId>
org.springframework.cloud
</groupId>
<artifactId>
spring-cloud-starter-openfeign
</artifactId>
<version>
2.0.0.RELEASE
</version>
</dependency>
<dependency>
<groupId>
org.springframework.cloud
</groupId>
<artifactId>
spring-cloud-starter-netflix-ribbon
</artifactId>
<version>
2.0.0.RELEASE
</version>
</dependency>
<dependency>
<groupId>
com.alibaba.csp
</groupId>
<artifactId>
sentinel-spring-webmvc-adapter
</artifactId>
<version>
1.8.2
</version>
</dependency>
</dependencies>
</project>
\ No newline at end of file
nacos-server-gateway/src/main/java/com/kwan/springcloudalibaba/GatewayApplication.java
0 → 100644
浏览文件 @
c64081ad
package
com.kwan.springcloudalibaba
;
import
com.alibaba.cloud.nacos.ribbon.NacosRule
;
import
com.netflix.loadbalancer.IPing
;
import
com.netflix.loadbalancer.IRule
;
import
com.netflix.loadbalancer.PingUrl
;
import
org.springframework.boot.SpringApplication
;
import
org.springframework.boot.autoconfigure.SpringBootApplication
;
import
org.springframework.cloud.client.discovery.EnableDiscoveryClient
;
import
org.springframework.cloud.openfeign.EnableFeignClients
;
import
org.springframework.context.annotation.Bean
;
/**
* http://localhost:18088/sentinel/nameInfo
*
* @author : qinyingjie
* @version : 2.2.0
* @date : 2023/1/17 12:37
*/
@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
public
class
GatewayApplication
{
@Bean
public
IRule
randomRule
()
{
return
new
NacosRule
();
//nacos的策略
}
@Bean
public
IPing
iping
()
{
return
new
PingUrl
();
}
public
static
void
main
(
String
[]
args
)
{
SpringApplication
.
run
(
GatewayApplication
.
class
,
args
);
System
.
out
.
println
(
"-------------------------------网关服务启动成功-------------------------------"
);
}
}
nacos-server-gateway/src/main/java/com/kwan/springcloudalibaba/constant/RespConstant.java
0 → 100644
浏览文件 @
c64081ad
package
com.kwan.springcloudalibaba.constant
;
public
class
RespConstant
{
public
static
final
Integer
RESP_CODE_FLOW_LIMITING_EXCEPTION
=
441
;
public
static
final
String
RESP_MSG_FLOW_LIMITING_EXCEPTION
=
"流量控制"
;
}
nacos-server-gateway/src/main/java/com/kwan/springcloudalibaba/controller/FlowLimitController.java
0 → 100644
浏览文件 @
c64081ad
package
com.kwan.springcloudalibaba.controller
;
import
com.alibaba.csp.sentinel.annotation.SentinelResource
;
import
com.alibaba.csp.sentinel.slots.block.BlockException
;
import
lombok.extern.slf4j.Slf4j
;
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
java.util.concurrent.TimeUnit
;
/**
* 限流测试
* http://localhost:18088/sentinel/nameInfo
*
* @author : qinyingjie
* @version : 2.2.0
* @date : 2023/2/2 17:13
*/
@Slf4j
@RestController
@RequestMapping
(
"/flowLimit"
)
public
class
FlowLimitController
{
/**
* http://127.0.0.1:8086/flowLimit/testA
*/
@GetMapping
(
"/testA"
)
public
String
testA
()
{
System
.
out
.
println
(
"------ testA ------"
);
return
"------testA"
;
}
@GetMapping
(
"/testB"
)
public
String
testB
()
{
try
{
TimeUnit
.
SECONDS
.
sleep
(
3
);
}
catch
(
InterruptedException
e
)
{
e
.
printStackTrace
();
}
System
.
out
.
println
(
"------ testB ------"
);
return
"------testB"
;
}
@GetMapping
(
"/testC"
)
public
String
testC
()
{
try
{
int
a
=
1
/
0
;
System
.
out
.
println
(
"------ testC ------"
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
return
"------testC"
;
}
@GetMapping
(
"/testD"
)
public
String
testD
()
{
try
{
TimeUnit
.
SECONDS
.
sleep
(
1
);
}
catch
(
InterruptedException
e
)
{
e
.
printStackTrace
();
}
return
"------testD"
;
}
@SentinelResource
@GetMapping
(
"/testE"
)
public
String
testDD
()
{
try
{
TimeUnit
.
SECONDS
.
sleep
(
100
);
}
catch
(
InterruptedException
e
)
{
e
.
printStackTrace
();
}
return
"------testE"
;
}
/**
* 热点规则
*
* @param p1
* @param p2
* @return
*/
@GetMapping
(
"/testHotKey"
)
@SentinelResource
(
value
=
"testHotKey"
)
public
String
testHotKey
(
@RequestParam
(
value
=
"p1"
,
required
=
false
)
String
p1
,
@RequestParam
(
value
=
"p2"
,
required
=
false
)
String
p2
)
{
return
"------testHotKey"
;
}
@GetMapping
(
"/testHotKey2"
)
@SentinelResource
(
value
=
"testHotKey2"
,
blockHandler
=
"dealHandler_testHotKey"
)
public
String
testHotKey2
(
@RequestParam
(
value
=
"p1"
,
required
=
false
)
String
p1
,
@RequestParam
(
value
=
"p2"
,
required
=
false
)
String
p2
)
{
log
.
info
(
"testE 热点参数"
);
return
"------testHotKey2"
;
}
/**
* 自定义异常
*
* @param p1
* @param p2
* @param exception
* @return
*/
public
String
dealHandler_testHotKey
(
String
p1
,
String
p2
,
BlockException
exception
)
{
// 默认 Blocked by Sentinel (flow limiting)
return
"-----dealHandler_testHotKey"
;
}
@GetMapping
(
"/persistent"
)
public
String
persistent
()
{
log
.
info
(
"persistent 测试持久化"
);
return
"------persistent 测试持久化"
;
}
}
\ No newline at end of file
nacos-server-gateway/src/main/java/com/kwan/springcloudalibaba/controller/LocalController.java
0 → 100644
浏览文件 @
c64081ad
package
com.kwan.springcloudalibaba.controller
;
import
com.alibaba.csp.sentinel.Entry
;
import
com.alibaba.csp.sentinel.SphU
;
import
com.alibaba.csp.sentinel.slots.block.BlockException
;
import
com.alibaba.csp.sentinel.slots.block.RuleConstant
;
import
com.alibaba.csp.sentinel.slots.block.flow.FlowRule
;
import
com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager
;
import
org.springframework.web.bind.annotation.RestController
;
import
java.util.ArrayList
;
import
java.util.List
;
@RestController
public
class
LocalController
{
public
static
void
main
(
String
[]
args
)
{
initFlowRules
();
while
(
true
)
{
Entry
entry
=
null
;
try
{
entry
=
SphU
.
entry
(
"HelloWorld"
);
/*您的业务逻辑 - 开始*/
System
.
out
.
println
(
"hello world"
);
/*您的业务逻辑 - 结束*/
}
catch
(
BlockException
e1
)
{
/*流控逻辑处理 - 开始*/
System
.
out
.
println
(
"block!"
);
/*流控逻辑处理 - 结束*/
}
finally
{
if
(
entry
!=
null
)
{
entry
.
exit
();
}
}
}
}
/**
* 资源 HelloWorld 每秒最多只能通过 20 个请求。
*/
private
static
void
initFlowRules
()
{
List
<
FlowRule
>
rules
=
new
ArrayList
<>();
FlowRule
rule
=
new
FlowRule
();
rule
.
setResource
(
"HelloWorld"
);
rule
.
setGrade
(
RuleConstant
.
FLOW_GRADE_QPS
);
// Set limit QPS to 20.
rule
.
setCount
(
1
);
rules
.
add
(
rule
);
FlowRuleManager
.
loadRules
(
rules
);
}
}
\ No newline at end of file
nacos-server-gateway/src/main/java/com/kwan/springcloudalibaba/controller/SentinelController.java
0 → 100644
浏览文件 @
c64081ad
package
com.kwan.springcloudalibaba.controller
;
import
com.alibaba.csp.sentinel.annotation.SentinelResource
;
import
com.alibaba.csp.sentinel.slots.block.BlockException
;
import
com.kwan.springcloudalibaba.api.FeignUserService
;
import
com.kwan.springcloudalibaba.common.Result
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.http.MediaType
;
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
;
/**
* http://localhost:18088/sentinel/nameInfo
*
* @author : qinyingjie
* @version : 2.2.0
* @date : 2023/2/2 17:13
*/
@RestController
@RequestMapping
(
"/sentinel"
)
public
class
SentinelController
{
@Autowired
private
FeignUserService
feignUserService
;
/**
* feign调用
* http://127.0.0.1:8085/nacos/consumer/1
* <p>
* http://localhost:9091/user/1
*
* @param id
* @return
*/
@GetMapping
(
value
=
"/{id}"
,
produces
=
MediaType
.
APPLICATION_PROBLEM_JSON_VALUE
)
public
Result
getUserById
(
@PathVariable
Integer
id
)
{
return
Result
.
ok
(
feignUserService
.
selectOne
(
id
));
}
/**
* 获取配置的变量
* http://localhost:8086/sentinel/nameInfo
*/
@GetMapping
(
value
=
"/nameInfo"
,
produces
=
MediaType
.
APPLICATION_PROBLEM_JSON_VALUE
)
public
Result
nameInfo
()
{
return
Result
.
ok
();
}
/**
* http://localhost:8086/sentinel/world
*
* @return
*/
@GetMapping
(
"/world"
)
@SentinelResource
(
value
=
"helloWorld"
,
blockHandler
=
"helloBlock"
)
public
String
helloWorld
()
{
return
"Hello world"
;
}
/**
* 回调地址
*
* @param e
* @return
*/
public
String
helloBlock
(
BlockException
e
)
{
return
"你已被流控"
;
}
}
\ No newline at end of file
nacos-server-gateway/src/main/java/com/kwan/springcloudalibaba/handler/UrlBlockHandler.java
0 → 100644
浏览文件 @
c64081ad
package
com.kwan.springcloudalibaba.handler
;
import
com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.BlockExceptionHandler
;
import
com.alibaba.csp.sentinel.slots.block.BlockException
;
import
com.alibaba.csp.sentinel.slots.block.authority.AuthorityException
;
import
com.alibaba.csp.sentinel.slots.block.degrade.DegradeException
;
import
com.alibaba.csp.sentinel.slots.block.flow.FlowException
;
import
com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowException
;
import
com.alibaba.csp.sentinel.slots.system.SystemBlockException
;
import
com.fasterxml.jackson.annotation.JsonInclude
;
import
com.fasterxml.jackson.databind.ObjectMapper
;
import
com.kwan.springcloudalibaba.common.Result
;
import
org.springframework.stereotype.Component
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletResponse
;
@Component
public
class
UrlBlockHandler
implements
BlockExceptionHandler
{
@Override
public
void
handle
(
HttpServletRequest
httpServletRequest
,
HttpServletResponse
httpServletResponse
,
BlockException
e
)
throws
Exception
{
String
msg
=
null
;
if
(
e
instanceof
FlowException
)
{
//限流异常
msg
=
"接口已被限流"
;
}
else
if
(
e
instanceof
DegradeException
)
{
//熔断异常
msg
=
"接口已被熔断,请稍后再试"
;
}
else
if
(
e
instanceof
ParamFlowException
)
{
//热点参数限流
msg
=
"热点参数限流"
;
}
else
if
(
e
instanceof
SystemBlockException
)
{
//系统规则异常
msg
=
"系统规则(负载不满足要求)"
;
}
else
if
(
e
instanceof
AuthorityException
)
{
//授权规则异常
msg
=
"授权规则不通过"
;
}
httpServletResponse
.
setStatus
(
500
);
httpServletResponse
.
setCharacterEncoding
(
"UTF-8"
);
httpServletResponse
.
setContentType
(
"application/json;charset=utf-8"
);
//ObjectMapper是内置Jackson的序列化工具类,这用于将对象转为JSON字符串
ObjectMapper
mapper
=
new
ObjectMapper
();
//某个对象属性为null时不进行序列化输出
mapper
.
setSerializationInclusion
(
JsonInclude
.
Include
.
NON_NULL
);
mapper
.
writeValue
(
httpServletResponse
.
getWriter
(),
Result
.
error
(
300
,
msg
)
);
}
}
\ No newline at end of file
nacos-server-gateway/src/main/resources/bootstrap.yml
0 → 100644
浏览文件 @
c64081ad
#端口号
server
:
port
:
8088
#spring配置
spring
:
application
:
name
:
nacos-server-sentinel-consumer
profiles
:
active
:
dev
cloud
:
nacos
:
discovery
:
server-addr
:
http://120.79.36.53:8848
#服务注册地址
config
:
server-addr
:
http://120.79.36.53:8848
#配置中心地址
file-extension
:
yaml
#文件类型
group
:
DEV_GROUP
#组别
namespace
:
4cd9bd32-8f25-45cd-b919-df1a0df146e0
#命名空间
refresh-enabled
:
true
#默认自动刷新
sentinel
:
transport
:
dashboard
:
127.0.0.1:8181
port
:
8719
#默认端口,如果被占用则从8719依次+1扫描
datasource
:
ds1
:
nacos
:
server-addr
:
http://120.79.36.53:8848
username
:
nacos
password
:
nacos
dataId
:
nacos-server-sentinel-consumer
# 微服务名称
groupId
:
DEFAULT_GROUP
data-type
:
json
rule-type
:
flow
# 流控规则
\ No newline at end of file
nacos-server-gateway/src/test/java/com/kwan/springcloudalibaba/SentinelConsumerApplicationTests.java
0 → 100644
浏览文件 @
c64081ad
package
com.kwan.springcloudalibaba
;
import
org.junit.jupiter.api.Test
;
import
org.springframework.boot.test.context.SpringBootTest
;
@SpringBootTest
class
SentinelConsumerApplicationTests
{
@Test
void
contextLoads
()
{
}
}
nacos-server-sentinel-consumer/src/main/resources/bootstrap.yml
浏览文件 @
c64081ad
...
...
@@ -11,9 +11,9 @@ spring:
cloud
:
nacos
:
discovery
:
server-addr
:
localhost
:8848
#服务注册地址
server-addr
:
http://120.79.36.53
:8848
#服务注册地址
config
:
server-addr
:
localhost
:8848
#配置中心地址
server-addr
:
http://120.79.36.53
:8848
#配置中心地址
file-extension
:
yaml
#文件类型
group
:
DEV_GROUP
#组别
namespace
:
4cd9bd32-8f25-45cd-b919-df1a0df146e0
#命名空间
...
...
@@ -25,7 +25,9 @@ spring:
datasource
:
ds1
:
nacos
:
server-addr
:
localhost:8848
server-addr
:
http://120.79.36.53:8848
username
:
nacos
password
:
nacos
dataId
:
nacos-server-sentinel-consumer
# 微服务名称
groupId
:
DEFAULT_GROUP
data-type
:
json
...
...
pom.xml
浏览文件 @
c64081ad
...
...
@@ -26,6 +26,7 @@
<module>
nacos-server-consumer
</module>
<module>
nacos-server-feign-api
</module>
<module>
nacos-server-sentinel-consumer
</module>
<module>
nacos-server-gateway
</module>
</modules>
<dependencyManagement>
...
...
@@ -45,13 +46,13 @@
<type>
pom
</type>
<scope>
import
</scope>
</dependency>
<!-- <dependency>-->
<!-- <groupId>org.springframework.cloud</groupId>-->
<!-- <artifactId>spring-cloud-dependencies</artifactId>-->
<!-- <version>Hoxton.SR3</version>-->
<!-- <type>pom</type>-->
<!-- <scope>import</scope>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>org.springframework.cloud</groupId>-->
<!-- <artifactId>spring-cloud-dependencies</artifactId>-->
<!-- <version>Hoxton.SR3</version>-->
<!-- <type>pom</type>-->
<!-- <scope>import</scope>-->
<!-- </dependency>-->
<dependency>
<groupId>
com.netflix.archaius
</groupId>
<artifactId>
archaius-core
</artifactId>
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录