第一步:业务描述?(通过sca-ui工程向网关工程发送ajax请求,并进行响应处理)
?第二步:创建sca-ui工程,例如:
目录结构:
?
第二步:在sca-ui工程中添加spring-boot-starter-web依赖。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
?第三步:在sca-ui工程中启动类,例如:
package com.jt;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoUIApplication {
public static void main(String[] args) {
SpringApplication.run(DemoUIApplication.class, args);
}
}
第四步:在sca-ui工程创建static目录,在此目录下添加js文件,html文件,例如:
第五步:在sca-gateway的配置文件中添加跨域配置,例如:?
?第六步:在HTML文件中判断自己定义的规则
方式一
在idea 启动配置中心(nacos)和网关(sentinel)或者黑窗口启动
?分别在浏览器访问:
nacos注册中心:
http://localhost:8848/nacos????????????
sentinel服务:
http://localhost:8180
配置sentinel服务:
?打开浏览器访问:
?方法二:
?配置sentinel服务:
?
?打开浏览器访问:
?代码如下:
1.idex.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div>
<h2>The Index Page</h2>
<button onclick="doBuy()">Buy</button>
<span id="result"></span>
</div>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<!--<script src="/js/axios.min.js"></script>-->
<script>
function doBuy(){
/* debugger*/
//1.基于axios框架发送异步ajax请求
let url="http://localhost:9000/nacos/provider/echo/1"
let span=document.getElementById("result");
axios.get(url)
.then(function (response) {//请求ok,执行then
console.log(response.data);
if(response.data.state===429){
span.innerHTML = response.data.message
}else {
span.innerHTML = response.data
}
})
.catch(function (error) {
//console.log(error);
if(error.response.status==429){
span.innerHTML = error.response.statusText;
}
});
//2.将响应结果更新到页面上
}
</script>
</body>
</html>
2.DemoUIApplication.java
package com.jt;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoUIApplication {
public static void main(String[] args) {
SpringApplication.run(DemoUIApplication.class, args);
}
}
3,bootstrap.yml
server:
port: 9000
spring:
application:
name: sca-gateway
cloud:
nacos:
discovery:
server-addr: localhost:8848
config:
server-addr: localhost:8848 #配置中心地址
file-extension: yml
gateway:
routes: #配置网关路由规则
- id: route01 #路由id,自己指定一个唯一值即可
#uri: http://localhost:8081/ #网关帮我们转发的url
uri: lb://sca-provider #lb表示负载均衡,sca-provider为服务名
predicates: ###断言(谓词):匹配请求规则(进行逻辑判断) http://ip:port/nacos/provider/echo/01
- Path=/nacos/provider/echo/** #请求路径定义,此路径对应uri中的资源
# - After=2021-11-20T23:59:59.789+08:00[Asia/Shanghai]
#- Query=pageSize,\d+
filters: ##网关过滤器,用于对谓词中的内容进行判断分析以及处理
- StripPrefix=1 #转发之前去掉path中第一层路径,例如nacos
globalcors:
cors-configurations:
'[/**]':
# "*":这个表示任意路径
allowedOrigins: "*"
# "*":这个表示任意请求
allowedMethods: "*"
#限流设计及实现
sentinel:
eager: true
transport:
dashboard: localhost:8180
#我们打开浏览器输入http://localhost:9000/nacos/provider/echo/01时,
#网关会基于predicates对象对请求url基于predicates中的定义path进行比对,
#假如请求url端口号后面的内容,与predicates中path的定义是匹配的,此时会将url交给filters进行过滤
#过滤器filter对请求过滤后,会将请求地址转发到真实的微服务(通过uri指定)
4,GatewayConfig.java
package com.jt;
import com.alibaba.csp.sentinel.adapter.gateway.sc.callback.BlockRequestHandler;
import com.alibaba.csp.sentinel.adapter.gateway.sc.callback.GatewayCallbackManager;
import com.alibaba.fastjson.JSON;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.reactive.function.server.ServerResponse;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import java.util.HashMap;
import java.util.Map;
@Configuration
public class GatewayConfig {
public GatewayConfig(){
GatewayCallbackManager.setBlockHandler(new BlockRequestHandler() {
@Override
public Mono<ServerResponse> handleRequest(ServerWebExchange serverWebExchange, Throwable throwable) {
Map<String,Object> map=new HashMap<>();
map.put("state",429);
map.put("message","访问太频繁");
String jsonStr= JSON.toJSONString(map);
return ServerResponse.ok().body(Mono.just(jsonStr),String.class);
}
});
}
}
|