parent
							
								
									8d071e2ac3
								
							
						
					
					
						commit
						d642a4f9c6
					
				| @ -0,0 +1,50 @@ | ||||
| package com.gitee.sop.gatewaycommon.gateway.controller; | ||||
| 
 | ||||
| import com.gitee.sop.gatewaycommon.bean.SpringContext; | ||||
| import com.gitee.sop.gatewaycommon.gateway.loadbalancer.SopLoadBalancerClient; | ||||
| import org.springframework.cloud.client.ServiceInstance; | ||||
| import org.springframework.cloud.gateway.webflux.ProxyExchange; | ||||
| import org.springframework.http.ResponseEntity; | ||||
| import org.springframework.stereotype.Controller; | ||||
| import org.springframework.util.StringUtils; | ||||
| import org.springframework.web.bind.annotation.RequestMapping; | ||||
| import org.springframework.web.server.ServerWebExchange; | ||||
| import reactor.core.publisher.Mono; | ||||
| 
 | ||||
| /** | ||||
|  * 处理restful请求 | ||||
|  * @author tanghc | ||||
|  */ | ||||
| @Controller | ||||
| public class RestfulController { | ||||
| 
 | ||||
|     private static final int PREFIX_LEN = "/rest/".length(); | ||||
| 
 | ||||
|     @RequestMapping("/rest/**") | ||||
|     public Mono<ResponseEntity<byte[]>> proxy(ProxyExchange<byte[]> proxy, ServerWebExchange exchange) { | ||||
|         String path = proxy.path(); | ||||
|         String serviceId = getServiceId(path); | ||||
|         String targetPath = getTargetPath(serviceId, path); | ||||
|         String rawQuery = exchange.getRequest().getURI().getRawQuery(); | ||||
|         if (StringUtils.hasLength(rawQuery)) { | ||||
|             targetPath = targetPath + "?" + rawQuery; | ||||
|         } | ||||
|         // 负载均衡
 | ||||
|         ServiceInstance serviceInstance = SpringContext.getBean(SopLoadBalancerClient.class).choose(serviceId, exchange); | ||||
|         String uri = "http://" + serviceInstance.getHost() + ":" + serviceInstance.getPort() + targetPath; | ||||
|         return proxy.uri(uri).forward(); | ||||
|     } | ||||
| 
 | ||||
|     private String getServiceId(String path) { | ||||
|         // /rest/story-service/food/getFoodById
 | ||||
|         path = path.substring(PREFIX_LEN); | ||||
|         int index = path.indexOf('/'); | ||||
|         path = path.substring(0, index); | ||||
|         return path; | ||||
|     } | ||||
| 
 | ||||
|     private String getTargetPath(String serviceId, String path) { | ||||
|         int len = PREFIX_LEN + serviceId.length(); | ||||
|         return path.substring(len); | ||||
|     } | ||||
| } | ||||
| @ -1,6 +1,9 @@ | ||||
| server.port=2222 | ||||
| spring.application.name=story-service | ||||
| register.url=127.0.0.1:8848 | ||||
| # 注册中心 | ||||
| # \u6CE8\u518C\u4E2D\u5FC3 | ||||
| spring.cloud.nacos.discovery.server-addr=${register.url} | ||||
| 
 | ||||
| # \u4E0A\u4F20\u6587\u4EF6\u6700\u5927\u503C | ||||
| spring.servlet.multipart.max-file-size=20MB | ||||
| spring.servlet.multipart.max-request-size=20MB | ||||
					Loading…
					
					
				
		Reference in new issue