自己做项目的网站,专门教做衣服的网站,网站代码备份,怎样才能申请网站当国内大部分都是粘贴复制一些重型框架时#xff0c;有没有人会想到#xff0c;我们自己做一个小项目#xff0c;几个小的Spring boot的项目时#xff0c;我们是否还需要按部就班的用我们公司中用到的Nacos#xff0c;这种冗余且调配复杂的组件呢#xff1f;
不是本人说…当国内大部分都是粘贴复制一些重型框架时有没有人会想到我们自己做一个小项目几个小的Spring boot的项目时我们是否还需要按部就班的用我们公司中用到的Nacos这种冗余且调配复杂的组件呢
不是本人说什么得罪同行的话。
很多程序员在开发和编码过程中很少自己去真正的研究一个框架和组件他们大部分的工作只是在自己接手的项目上缝缝补补罢了。
假如某一天老板或者有个客户说【我想要做一个项目加钱好说那么你是否能真正的独立完成一个项目框架吗】
那么我们从API路由开始尝试做一个轻量级的实践。
1. Spring Cloud Gateway
今天我们来实现Spring Cloud Gateway我们首先了解一下Spring Cloud Gateway是什么东东
Spring Cloud Gateway 是 Spring Cloud 生态系统的一部分提供了简单、有效的方式来路由到API并为它们提供跨域处理、安全、监控/指标和弹性。 Route路由: 网关的基本构件。它由一个ID、一个目的地URI、一个谓词Predicate集合和一个过滤器Filter集合定义。如果集合谓词为真则路由被匹配。 Predicate谓词: 这是一个 Java 8 Function Predicate。输入类型是 Spring Framework ServerWebExchange。这让你可以在HTTP请求中的任何内容上进行匹配比如header或查询参数。 Filter过滤器: 这些是 GatewayFilter 的实例已经用特定工厂构建。在这里你可以在发送下游请求之前或之后修改请求和响应。 添加图片注释不超过 140 字可选
客户端向 Spring Cloud Gateway 发出请求。如果Gateway处理程序映射确定一个请求与路由相匹配它将被发送到Gateway Web处理程序。这个处理程序通过一个特定于该请求的过滤器链来运行该请求。过滤器被虚线分割的原因是过滤器可以在代理请求发送之前和之后运行逻辑。所有的 pre 前过滤器逻辑都被执行。然后发出代理请求。在代理请求发出后post 后过滤器逻辑被运行。
2.实现
我们来新建简单的Maven一个工程在pom.xml代码中引入Gateway。 dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-gateway/artifactId
/dependency
我们再简单的写一个main来启动工程看一看。 Slf4j
EnableDiscoveryClient
SpringBootApplication
PropertySource(classpath:config/application.properties)
public class GateWayServiceApplication {/*** b功能描述/b启动br* b修订记录/bbr*/public static void main(String[] args) {SpringApplication.run(GateWayServiceApplication.class, args);log.info(网管服务启动成功);}
}
点击启动结果是启动不起来的为什么呢
我们父级pom都会引入spring-boot-starter-web组件可是web组件内基本都是使用tomcat来作为服务发布内置组件这里我还做了更改我希望我的整个项目使用undertow。
那么怎么来更改呢
父级pom排除Tomcat使用undertow您也可以不使用unsertow直接使用tomcat的话不用exclusions也无需引入undertow。
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactIdexclusionsexclusiongroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-tomcat/artifactId/exclusion/exclusions
/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-undertow/artifactId
/dependency
那么在Gateway内如何更改呢
Gateway使用 Spring WebFlux 作为服务那么我们需要去除undertow或者Tomcat使用WebFlux.
更改示例如下 dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactIdexclusionsexclusiongroupId*/groupIdartifactId*/artifactId/exclusion/exclusions
/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-undertow/artifactIdexclusionsexclusiongroupId*/groupIdartifactId*/artifactId/exclusion/exclusions
/dependency
如果在父级项目还引入了Eureka那么我们还需要排除Eureka内的web服务。
dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-netflix-eureka-client/artifactIdexclusionsexclusiongroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/exclusion/exclusions
/dependency
重新启动项目这下就可以完美启动了。
3. 跨域请求
接下来我们所有的配置所属都在配置中进行在我们日常开发中经常会被跨域请求绞挠的难受网络充斥着大量的无用cors跨域配置。
那么我们看下如何在Gateway中如何正确的配置跨域。
spring.cloud.gateway.globalcors.cors-configurations.[/**].allow-credentialstrue
spring.cloud.gateway.globalcors.cors-configurations.[/**].allowed-origins[0]http://localhost:8080
spring.cloud.gateway.globalcors.cors-configurations.[/**].allowed-origins[1]http://localhost:8081
spring.cloud.gateway.globalcors.cors-configurations.[/**].allowed-origins[2]http://localhost:63343
spring.cloud.gateway.globalcors.cors-configurations.[/**].allowed-headers*
spring.cloud.gateway.globalcors.cors-configurations.[/**].allowed-methods[0]OPTIONS
spring.cloud.gateway.globalcors.cors-configurations.[/**].allowed-methods[1]GET
spring.cloud.gateway.globalcors.cors-configurations.[/**].allowed-methods[2]POST
spring.cloud.gateway.globalcors.cors-configurations.[/**].max-age3600
以上就是跨域配置只需要在allowed-origins数组内添加需要跨域的链接即可解决跨域问题。
4. API路由配置转发
#设置路由id
spring.cloud.gateway.routes[0].idmanager-server
#设置路由的uri
spring.cloud.gateway.routes[0].urilb://manager-server
#设置路由断言,代理servicerId为manager-server的/gb/路径
spring.cloud.gateway.routes[0].predicates[0]Path/api/manager/**
使用routes数组来增加路由API的增减。
5. WebSocket配置转发
#设置路由id
spring.cloud.gateway.routes[2].idmanager-server-socket
#设置路由的uri
spring.cloud.gateway.routes[2].urilb:ws://manager-server
#设置路由断言,代理servicerId为manager-server的/exchange/路径
spring.cloud.gateway.routes[2].predicates[0]Path/ws/**
这里我们要记住socket路由转发是配合SockJS的假如使用普通的websocket似乎有一些困难哦。
SockJS实现可以参考网络内容SockJSStompJS实现websocket它也是很好的实现哦。
如上我们基本实现了API及websocket、跨域等基础问题的解决。