为何会有布吕马难题
即使应用程序的相混经济政策,就会造成布吕马。比如说推送的触发器允诺是相同的三个源,就比如是相同的的三个路由器或是相同的三个协定或是相同的搜索引擎。虽然应用程序为的是安全可靠考量,就会造成三个相混经济政策,并非同三个地方性出的是不容许展开可视化的。
常用的布吕马化解形式
在掌控层重新加入容许布吕马的注释 @CrossOrigin采用httpclient,不倚赖应用程序采用交换机 Gateway注释:@CrossOrigin
在控制层重新加入容许布吕马的注释,方可顺利完成三个工程项目中其间路由器布吕马的难题
交换机资源整合
Spring Cloud Gateway做为Spring Cloud生态系中的交换机,最终目标是代替Netflix Zuul,其 不但提供国际标准化的路由器形式,因此还如前所述Filer链的形式提供更多了交换机基本上的机能,比如:安全可靠、监 控/埋点、开闭等。
(1)路由器
路由器是交换机最此基础的部份,路由器重要信息有三个ID、三个目地URL、几组论断和几组 Filter共同组成。假如论断路由器为真,则表明允诺的URL和实用性相匹配
(2)论断
Java8中的论断表达式。Spring Cloud Gateway中的论断表达式输出类别是Spring5.0框 架中的ServerWebExchange。Spring Cloud Gateway中的论断表达式容许开发人员去表述相匹配源自 于http request中的任何人重要信息,比如允诺头和模块等。
(3)冷却系统
三个国际标准的Spring webFilter。Spring cloud gateway中的filter分成三种类别的 Filter,依次是Gateway Filter和Global Filter。冷却系统Filter将会对允诺和响应展开修改处理
Spring cloud Gateway发出允诺。然后再由Gateway Handler Mapping中找到与请 求相相匹配的路由器,将其推送到Gateway web handler。Handler再通过指定的冷却系统链将允诺发 送到实际的服务执行业务逻辑,然后返回。
工程项目中采用
新建模块service_gateway
<dependencies> <!– 公共模块倚赖 –> <dependency> <groupId>com.lzq</groupId> <artifactId>service_utils</artifactId> <version>0.0.1-SNAPSHOT</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>实用性文件
#服务路由器 server.port=9090 # 服务名 spring.application.name=service-gateway # nacos服务地址 默认8848 spring.cloud.nacos.discovery.server-addr=127.0.0.1:8888 #采用服务发现路由器 spring.cloud.gateway.discovery.locator.enabled=true #设置路由器id spring.cloud.gateway.routes[0].id=service-hosp #设置路由器的uri lb负载均衡 spring.cloud.gateway.routes[0].uri=lb://service-hosp#设置路由器论断,代理servicerId为auth-service的/auth/路径 spring.cloud.gateway.routes[0].predicates= Path=/*/hosp/**#设置路由器id spring.cloud.gateway.routes[1].id=service-cmn #设置路由器的uri spring.cloud.gateway.routes[1].uri=lb://service-cmn #设置路由器论断,代理servicerId为auth-service的/auth/路径 spring.cloud.gateway.routes[1].predicates= Path=/*/cmn/** #设置路由器id spring.cloud.gateway.routes[2].id=service-hosp #设置路由器的uri spring.cloud.gateway.routes[2].uri=lb://service-hosp #设置路由器论断,代理servicerId为auth-service的/auth/路径 spring.cloud.gateway.routes[2].predicates= Path=/*/userlogin/**创建启动类
@SpringBootApplication public class ApiGatewayApplication { public static void main(String[] args) { SpringApplication.run(ApiGatewayApplication.class, args); } }修改前端.evn文件,改成访问交换机路由器号
做集群部署时,他会根据名称实现负载均衡
布吕马理解:推送允诺后,交换机冷却系统会展开允诺拦截,将布吕马放行,转发到服务器中
布吕马实用性类
@Configuration public class CorsConfig { @Bean public CorsWebFilter corsFilter() { CorsConfiguration config = newCorsConfiguration(); config.addAllowedMethod(“*”); config.addAllowedOrigin(“*”); config.addAllowedHeader(“*”); UrlBasedCorsConfigurationSource source = newUrlBasedCorsConfigurationSource(new PathPatternParser()); source.registerCorsConfiguration(“/**”, config); return newCorsWebFilter(source); } }若之前采用注释布吕马,需要将@CrossOrigin去掉
Httpclient
常用的采用场景:多系统之间接口的可视化、爬虫
public class HttpTest { @Test public void test1() throws Exception { String url = “https://www.badu.com”; URL url1 = new URL(url); //url连接URLConnection urlConnection = url1.openConnection(); HttpURLConnection httpURLConnection = (HttpURLConnection)urlConnection; InputStream is = httpURLConnection.getInputStream(); //转换为字符串 InputStreamReader reader = new InputStreamReader(is, StandardCharsets.UTF_8); BufferedReader br =new BufferedReader(reader); String line; //将字符串一行一行读取出来 while ((line = br.readLine())!= null){ System.out.println(line); } } } //设置允诺类别httpURLConnection.setRequestMethod(“GET”); //允诺包含 允诺行、空格、允诺头、允诺体 //设置允诺头编码httpURLConnection.setRequestProperty(“Accept-Charset”,“utf-8”);采用HttpClient推送允诺、接收响应
创建HttpClient对象。创建允诺方法的实例,并指定允诺URL。假如需要推送GET允诺,创建HttpGet对象;假如需要推送POST允诺,创建HttpPost对象。假如需要推送允诺模块,可调用HttpGet、HttpPost共同的setParams(HetpParams params)方法来添加请求模块;对于HttpPost对象而言,也可调用setEntity(HttpEntity entity)方法来设置允诺模块。调用HttpClient对象的execute(HttpUriRequest request)推送允诺,该方法返回三个HttpResponse。释放连接。无论执行方法是否成功,都必须释放连接集成测试,添加倚赖
<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.13</version> </dependency> @Test public void test2(){ //可关闭的httpclient客户端,相当于打开三个应用程序CloseableHttpClient client = HttpClients.createDefault();String url = “https://www.baidu.com”; //构造httpGet允诺对象 HttpGet httpGet = new HttpGet(url); //响应 CloseableHttpResponse response = null; try{ response = client.execute(httpGet); String result = EntityUtils.toString(response.getEntity(), “utf-8”); System.out.println(result); }catch (Exception e) { e.printStackTrace(); }finally { //关闭流 if(client !=null){ try { client.close(); } catch(IOException e) { e.printStackTrace(); } } } }工程项目中采用,系统调用平台接口保存重要信息,根据传入josn数据保存重要信息
系统中
@RequestMapping(value=“/hospital/save”,method=RequestMethod.POST) public String saveHospital(String data, HttpServletRequest request) { try{ apiService.saveHospital(data); } catch (YyghException e) { return this.failurePage(e.getMessage(),request); }catch (Exception e) { return this.failurePage(“数据异常”,request); } return this.successPage(null,request); }saveHospital方法
@Override public boolean saveHospital(Stringdata) { JSONObject jsonObject = JSONObject.parseObject(data); Map<String, Object> paramMap = newHashMap<>(); paramMap.put(“hoscode”,“10000”); paramMap.put(“hosname”,jsonObject.getString(“hosname”)) //图片 paramMap.put(“logoData”, jsonObject.getString(“logoData”)); // http://localhost:8201/api/hosp/saveHospital //httpclient JSONObject respone = HttpRequestHelper.sendRequest(paramMap,this.getApiUrl()+“/api/hosp/saveHospital”); System.out.println(respone.toJSONString()); if(null != respone && 200== respone.getIntValue(“code”)) { return true; } else { throw new YyghException(respone.getString(“message”), 201); } }HttpRequestHelper工具类
/** * 封装同步允诺 * @param paramMap * @param url * @return */ public staticJSONObject sendRequest(Map<String, Object> paramMap, String url){ String result = “”; try { //封装post模块StringBuilder postdata =new StringBuilder(); for (Map.Entry<String, Object> param : paramMap.entrySet()) { postdata.append(param.getKey()).append(“=”) .append(param.getValue()).append(“&”); } log.info(String.format(“–> 推送允诺:post data %1s”, postdata)); byte[] reqData = postdata.toString().getBytes(“utf-8”); byte[] respdata = HttpUtil.doPost(url,reqData); result = new String(respdata); log.info(String.format(“–> 应答结果:result data %1s”, result)); } catch(Exception ex) { ex.printStackTrace(); }return JSONObject.parseObject(result); }HttpUtil工具类
public static byte[] send(String strUrl, String reqmethod, byte[] reqData) { try { URL url = newURL(strUrl); HttpURLConnection httpcon = (HttpURLConnection) url.openConnection(); httpcon.setDoOutput(true); httpcon.setDoInput(true); httpcon.setUseCaches(false); httpcon.setInstanceFollowRedirects(true); httpcon.setConnectTimeout(CONN_TIMEOUT); httpcon.setReadTimeout(READ_TIMEOUT); httpcon.setRequestMethod(reqmethod); httpcon.connect();if(reqmethod.equalsIgnoreCase(POST)) { OutputStream os = httpcon.getOutputStream(); os.write(reqData); os.flush(); os.close(); } BufferedReaderin = new BufferedReader(new InputStreamReader(httpcon.getInputStream(),“utf-8”)); String inputLine; StringBuilder bankXmlBuffer =new StringBuilder(); while ((inputLine = in.readLine()) !=null) { bankXmlBuffer.append(inputLine); } in.close(); httpcon.disconnect(); returnbankXmlBuffer.toString().getBytes(); }catch (Exception ex) { log.error(ex.toString(), ex); return null; } }对应平台接口
@RestController @RequestMapping(“/api/hosp”) public class ApiController { @Autowired private HospitalService hospitalService; @ApiOperation(value = “上传医院”) @PostMapping(“saveHospital”) publicR saveHospital(HttpServletRequest request) {//通过request取到前端接口传过来的值Map<String, String[]> parameterMap = request.getParameterMap();//将数组值转换成三个值Map<String, Object> paramMap = HttpRequestHelper.switchMap(parameterMap);//将map集合转成josn字符串 String mapStr = JSONObject.toJSONString(paramMap); //josn字符串转成对象Hospital hospital = JSONObject.parseObject(mapStr, Hospital.class); //重新加入MongoDB中hospitalService.saveHosp(hospital);return R.ok(); } }方可顺利完成相同系统中的相互调用
原文链接:
https://mp.weixin.qq.com/s/gcXQBsdCkgXzphUTbV-qRw
