一、SpringCloudGateway介绍
API网关出现的原因是微服务架构的出现,不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求。API网关是介于客户端和服务器端之间的中间层,所有的外部请求都会先经过API网关这一层。
SpringCloudGateway旨在为微服务架构提供简单、有效和统一的API路由管理方式,SpringCloudGateway作为SpringCloud生态系统中的网关,其不仅提供统一的路由方式,并且还基于Filter链的方式提供了网关基本的功能,例如:安全、监控/埋点、限流等。
二、搭建网关模块
第一步,修改配置pom.xml。
<dependencies><dependency><groupId>com.atguigu.yygh</groupId><artifactId>common-util</artifactId><version>1.0</version></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!--服务注册--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency></dependencies>
第二步,在resources下添加配置文件。
#服务端口server.port=80#服务名spring.application.name=service-gateway#nacos服务地址spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848#使用服务发现路由spring.cloud.gateway.discovery.locator.enabled=true#设置路由idspring.cloud.gateway.routes[0].id=service-hosp#设置路由的urispring.cloud.gateway.routes[0].uri=lb://service-hosp#设置路由断言,代理servicerId为auth-service的/auth/路径spring.cloud.gateway.routes[0].predicates=Path=/*/hosp/**#设置路由idspring.cloud.gateway.routes[1].id=service-dict#设置路由的urispring.cloud.gateway.routes[1].uri=lb://service-dict#设置路由断言,代理servicerId为auth-service的/auth/路径spring.cloud.gateway.routes[1].predicates=Path=/*/dict/**#springboot2.x版本支持的springcloud版本并不是最新的版本,最新的版本允许定义多个Path并用“,”隔开,但此版本springcloud若要定义多个同uri的Path,必须再写一个,如下:#设置路由idspring.cloud.gateway.routes[2].id=service-hosp#设置路由的urispring.cloud.gateway.routes[2].uri=lb://service-hosp#设置路由断言,代理servicerId为auth-service的/auth/路径spring.cloud.gateway.routes[2].predicates=Path=/*/user/**
第三步,添加启动类。开启@EnableDiscoveryClient
注解,向Nacos注册服务。
@SpringBootApplication@EnableDiscoveryClientpublicclassServerGatewayApplication{publicstaticvoidmain(String[]args){SpringApplication.run(ServerGatewayApplication.class,args);}}
三、跨域问题处理
跨域问题是浏览器对于ajax请求的一种安全限制。一个页面发起的ajax请求,只能是与当前页域名相同的路径,这能有效的阻止跨站攻击。
跨域原因说明 | 示例 |
---|---|
域名不同 | www.jd.com与www.taobao.com |
域名相同,端口不同 | www.jd.com:8080与www.jd.com:8081 |
二级域名不同 | item.jd.com与miaosha.jd.com |
但是这却给我们的开发带来了不便,而且在实际生产环境中,肯定会有很多台服务器之间交互,地址和端口都可能不同。因此我们需要解决跨域问题,编写一个全局配置类,实现如下:
@ConfigurationpublicclassCorsConfig{@BeanpublicCorsWebFiltercorsFilter(){CorsConfigurationconfig=newCorsConfiguration();config.addAllowedMethod("*");config.addAllowedOrigin("*");config.addAllowedHeader("*");UrlBasedCorsConfigurationSourcesource=newUrlBasedCorsConfigurationSource(newPathPatternParser());source.registerCorsConfiguration("/**",config);returnnewCorsWebFilter(source);}}
注:目前我们已经在网关做了跨域处理,那么service服务就不需要再做跨域处理了,若controller类上添加过@CrossOrigin
注解标签的,需要去掉,否则会造成程序异常。