fix:网关服务

上级 c64081ad
...@@ -120,9 +120,29 @@ public class ConsumerUserController { ...@@ -120,9 +120,29 @@ public class ConsumerUserController {
/** /**
* 获取配置的变量 * 获取配置的变量
* <p>
* http://127.0.0.1:8085/nacos/consumer/nameInfo
*/ */
@GetMapping(value = "/nameInfo", produces = MediaType.APPLICATION_PROBLEM_JSON_VALUE) @GetMapping(value = "/nameInfo", produces = MediaType.APPLICATION_PROBLEM_JSON_VALUE)
public Result nameInfo() { public Result nameInfo() {
return Result.ok(); return Result.ok();
} }
/**
* http://127.0.0.1:8085/nacos/consumer/test
*/
@GetMapping(value = "/test", produces = MediaType.APPLICATION_PROBLEM_JSON_VALUE)
public Result test() {
return Result.ok();
}
/**
* 获取配置的变量
*/
@GetMapping(value = "/index", produces = MediaType.APPLICATION_PROBLEM_JSON_VALUE)
public Result index() {
return Result.ok();
}
} }
\ No newline at end of file
...@@ -16,8 +16,5 @@ spring: ...@@ -16,8 +16,5 @@ spring:
server-addr: http://120.79.36.53:8848 #配置中心地址 server-addr: http://120.79.36.53:8848 #配置中心地址
file-extension: yaml #文件类型 file-extension: yaml #文件类型
group: DEV_GROUP #组别 group: DEV_GROUP #组别
namespace: e750dcd5-657b-489b-8d15-b7b71aa3e984 #命名空间 namespace: 4cd9bd32-8f25-45cd-b919-df1a0df146e0 #命名空间
refresh-enabled: true #默认自动刷新 refresh-enabled: true #默认自动刷新
\ No newline at end of file
...@@ -14,74 +14,36 @@ ...@@ -14,74 +14,36 @@
<description>nacos-server-gateway</description> <description>nacos-server-gateway</description>
<dependencies> <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> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId> <artifactId>spring-boot-starter-actuator</artifactId>
<scope>test</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.alibaba.cloud</groupId> <groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.alibaba.cloud</groupId> <groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency> <version>2.1.5.RELEASE</version>
<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> </dependency>
<!--sentinel启动器-->
<dependency> <dependency>
<groupId>com.alibaba.cloud</groupId> <groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency> </dependency>
<!--sentinel持久化存储-->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
<dependency> <dependency>
<groupId>junit</groupId> <groupId>org.projectlombok</groupId>
<artifactId>junit</artifactId> <artifactId>lombok</artifactId>
</dependency> <optional>true</optional>
<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>
<dependency> <dependency>
<groupId>com.alibaba.csp</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>sentinel-spring-webmvc-adapter</artifactId> <artifactId>spring-boot-starter-test</artifactId>
<version>1.8.2</version> <scope>test</scope>
</dependency> </dependency>
</dependencies> </dependencies>
......
package com.kwan.springcloudalibaba; 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.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient; 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 @EnableDiscoveryClient
@SpringBootApplication @SpringBootApplication
public class GatewayApplication { public class GatewayApplication {
@Bean
public IRule randomRule() {
return new NacosRule(); //nacos的策略
}
@Bean
public IPing iping() {
return new PingUrl();
}
public static void main(String[] args) { public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args); SpringApplication.run(GatewayApplication.class, args);
System.out.println("-------------------------------网关服务启动成功-------------------------------"); System.out.println("-------------------------------网关服务启动成功-------------------------------");
......
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 = "流量控制";
}
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
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
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
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
#端口号 #端口号
server: server:
port: 8088 port: 8089
management:
endpoint:
health:
show-details: always
endpoints:
jmx:
exposure:
include: '*'
web:
exposure:
include: '*'
health:
sentinel:
enabled: false
#spring配置 #spring配置
spring: spring:
application: application:
name: nacos-server-sentinel-consumer name: nacos-server-gateway
profiles: profiles:
active: dev active: dev
cloud: cloud:
gateway:
enabled: true #开启网关
discovery:
locator:
enabled: true #启用DiscoveryClient
routes:
- id: route1
uri: lb://nacos-server-consumer
predicates:
- Path=/nacos/consumer/test,/nacos/consumer/index
- id: route2
uri: lb://nacos-server-producer
predicates:
- Path=/service/**
filter:
- AddRequestHeader=X-Request-Id,12345
nacos: nacos:
discovery: discovery:
server-addr: http://120.79.36.53:8848 #服务注册地址 server-addr: http://120.79.36.53:8848 #服务注册地址
config: username: nacos
server-addr: http://120.79.36.53:8848 #配置中心地址 password: nacos
file-extension: yaml #文件类型
group: DEV_GROUP #组别
namespace: 4cd9bd32-8f25-45cd-b919-df1a0df146e0 #命名空间
refresh-enabled: true #默认自动刷新
sentinel: sentinel:
transport: transport:
dashboard: 127.0.0.1:8181 dashboard: 127.0.0.1:8181
port: 8719 #默认端口,如果被占用则从8719依次+1扫描 port: 8719 #默认端口,如果被占用则从8719依次+1扫描
\ No newline at end of file
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
package com.kwan.springcloudalibaba;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class SentinelConsumerApplicationTests {
@Test
void contextLoads() {
}
}
...@@ -15,8 +15,8 @@ ...@@ -15,8 +15,8 @@
<java.version>1.8</java.version> <java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.3.7.RELEASE</spring-boot.version> <spring-boot.version>2.2.5.RELEASE</spring-boot.version>
<spring-cloud-alibaba.version>2.2.2.RELEASE</spring-cloud-alibaba.version> <spring-cloud-alibaba.version>2.2.1.RELEASE</spring-cloud-alibaba.version>
</properties> </properties>
<modules> <modules>
...@@ -45,14 +45,20 @@ ...@@ -45,14 +45,20 @@
<version>${spring-boot.version}</version> <version>${spring-boot.version}</version>
<type>pom</type> <type>pom</type>
<scope>import</scope> <scope>import</scope>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency> </dependency>
<!-- <dependency>-->
<!-- <groupId>org.springframework.cloud</groupId>-->
<!-- <artifactId>spring-cloud-dependencies</artifactId>-->
<!-- <version>Hoxton.SR3</version>-->
<!-- <type>pom</type>-->
<!-- <scope>import</scope>-->
<!-- </dependency>-->
<dependency> <dependency>
<groupId>com.netflix.archaius</groupId> <groupId>com.netflix.archaius</groupId>
<artifactId>archaius-core</artifactId> <artifactId>archaius-core</artifactId>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册