在整合.Net的过程中遇到不少问题,一般网上的例子只是调用一个简单的NodeJS示例,并未有详细的介绍及采坑过程。

首先,我的项目结构是:Vue前端 + SpringCloud后端 + .Net的WebApi后端

项目改造目标:Vue前端访问后端的网关Zuul,由Zuul配置请求转发,给SpringCloud微服务或者.Net的服务上。

要准备的SpringCloud工程有三个:Eureka服务端、Zuul网关服务、Sidecar的异构系统服务

1、Eureka就不多废话了

2、Zuul为了调试方便,加上Cors跨域访问的配置:

@Configuration
public class CorsConfig { @Bean
public CorsFilter corsFilter() {
final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
final CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.setAllowCredentials(true);
corsConfiguration.addAllowedHeader("*");
corsConfiguration.addAllowedOrigin("*");
corsConfiguration.addAllowedMethod("*");
source.registerCorsConfiguration("/**", corsConfiguration); return new CorsFilter(source);
}
}
  • 此处有一个跨域访问的坑:

浏览器会返回200但是得不到数据,并抛出异常: The 'Access-Control-Allow-Origin'  header contains multiple values  but only one

意思就是不能处理多个跨域的返回值,首先Zuul的跨域不能关闭,否则不能通过浏览器正常访问,那么到.Net的代码里关闭跨域配置:

 //config.EnableCors(new EnableCorsAttribute(WebSettingsConfig.CorsIp, "*", "*") { SupportsCredentials = true });

Zuul的application.yml

zuul:
ignoredServices: '*'
routes:
oldsys:
path: /api/**
serviceId: oldsys
strip-prefix: false
  • 此处一个请求转发的坑:

zuul转发给内部服务的时候会把Url的前缀剪掉,到达.net服务的Url变成了 http://localhost:17793/xxx

可以通过设置 strip-prefix: false 把Url还原成 http://localhost:17793/api/xxx  这样保留原来请求的完整请求路径。

顺便提一下原理,在SimpleRouteLocator.java类中,有这样一个方法就是此配置生效的原因:

     if (route.isStripPrefix()) {  //这里有个判断
int index = route.getPath().indexOf("*") - 1;
if (index > 0) {
String routePrefix = route.getPath().substring(0, index);
targetPath = targetPath.replaceFirst(routePrefix, "");
prefix = prefix + routePrefix;
}
}

3、sidecar服务

启动程序,开启sidecar:

@SpringBootApplication
@EnableSidecar
public class CapaOldSysApp {
public static void main(String[] args) {
SpringApplication.run(CapaOldSysApp.class, args);
}
}

Sidecar的application.yml

sidecar:
ip-address: localhost
port: 17793
health-uri: http://localhost:17793/health.json
  • 此处有很多坑,大多数是 Bad Request - Invalid Hostname  HTTP Error 400. The request hostname is invalid. 错误:
  1. 如果不设置sidecar异构系统的ip地址,也就是ip-address项,有可能读取不同网卡上(比如:虚拟机)的地址,导致请求发送不到目标系统上。
  2. 为目标系统创建health.json静态文件,并保证health-uri指定的地址可以被访问到,Eureka上状态为DOWN的服务是访问不了的。IIS服务器需要开启MiME设置。
  3. 查看http://localhost:8080/hosts/oldsys 的信息,确定host及port是不是目标系统的正确地址。
{
host: "localhost",
port: 17793,
metadata: {},
uri: "http://localhost:17793",
serviceId: "OLDSYS",
secure: false,
instanceInfo: {
instanceId: "192.168.161.1:8080",
app: "OLDSYS",
appGroupName: null,
ipAddr: "localhost",
sid: "na",
homePageUrl: "http://localhost:17793/",
statusPageUrl: "http://localhost:8080/info",
healthCheckUrl: "http://localhost:8080/health",
secureHealthCheckUrl: null,
vipAddress: "oldsys",
secureVipAddress: "oldsys",
countryId: 1,
dataCenterInfo: {
@class: "com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo",
name: "MyOwn"
},
hostName: "localhost",
status: "UP",
leaseInfo: {
renewalIntervalInSecs: 30,
durationInSecs: 90,
registrationTimestamp: 1557805465685,
lastRenewalTimestamp: 1557805733435,
evictionTimestamp: 0,
serviceUpTimestamp: 1557805343392
},
isCoordinatingDiscoveryServer: false,
metadata: {},
lastUpdatedTimestamp: 1557805465686,
lastDirtyTimestamp: 1557805465682,
actionType: "ADDED",
asgName: null,
overriddenStatus: "UNKNOWN"
}
}

IIS需要增加地址绑定,才可以用localhost以外的地址访问,更改.net程序的applicationhost.conf(调试环境在任务栏中找到IIS Express)可以增加地址映射:

<bindings>
    <binding protocol="http" bindingInformation="*:17793:localhost" />
    <binding protocol="http" bindingInformation="*:17793:127.0.0.1" />
</bindings>

其他的就没有什么可以注意的了,Eureka应用列表服务状态不能为DOWN,有时候Zuul需要同步Eureka的数据,首次访问基本不成功,多刷新几次。

SpringCloud Sidecar 整合.Net WebApi的更多相关文章

  1. SpringCloud Alibaba整合Sentinel

    SpringCloud Alibaba整合Sentinel Sentinel 控制台 1. 概述 Sentinel 提供一个轻量级的开源控制台,它提供机器发现以及健康情况管理.监控(单机和集群),规则 ...

  2. spring cloud中利用sidecar整合异构语言(转)

    用spring cloud sidecar的整合异构语言,以前做过没有做笔记,现在再做由于各种坑又浪费了一天,这里记一下 首先是官网:http://cloud.spring.io/spring-clo ...

  3. SpringCloud系列-整合Hystrix的两种方式

    Hystrix [hɪst'rɪks],中文含义是豪猪,因其背上长满棘刺,从而拥有了自我保护的能力.本文所说的Hystrix是Netflix开源的一款容错框架,同样具有自我保护能力. 本文目录 一.H ...

  4. 新版本SpringCloud sleuth整合zipkin

    SpringCloud Sleuth 简介 Spring Cloud Sleuth为Spring Cloud实现了分布式跟踪解决方案. Spring Cloud Sleuth借鉴了Dapper的术语. ...

  5. 整合.NET WebAPI和 Vuejs——在.NET单体应用中使用 Vuejs 和 ElementUI

    .NET简介 .NET 是一种用于构建多种应用的免费开源开发平台,例如: Web 应用.Web API 和微服务 云中的无服务器函数 云原生应用 移动应用 桌面应用 1). Windows WPF 2 ...

  6. SpringCloud Stream整合RabbitMQ3.5.0

    前言 点击进入Spring官网文档 本文章为单体项目,将消费者和生产者写在同一个项目中,介意者不用向下看了. 本文介绍三种应用方式: 1:普通整合RabbitMQ 2:消息分区 3:按条件消费(多个消 ...

  7. SpringCloud之整合Zipkin+Sleuth(十四)

    1.添加依赖 在项目的pom.xml文件中添加下面依赖 <!--里面包含两个依赖--> <dependency> <groupId>org.springframew ...

  8. springcloud gateway整合sentinel

    1.引入依赖 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spri ...

  9. SpringCloud之整合Feign

    假设提供者有如下服务接口方法 @RestController @RequestMapping("/person") public class PersonController { ...

随机推荐

  1. Python 爬取异步加载的数据

    在我们的工作中,可能会遇到这样的情况:我们需要爬取的数据是通过ajax异步加载的,这样的话通过requests得到的只是一个静态页面,而我们需要的是ajax动态加载的数据! 那我们应该怎么办呢??? ...

  2. day5 python代码块,流程控制

    判断类型 # isinstance 用法一 isinstance(值,类型)--------------->bool isinstance(5,int)-----------------> ...

  3. DEX文件解析--7、类及其类数据解析(完结篇)

    一.前言    前置技能链接:       DEX文件解析---1.dex文件头解析       DEX文件解析---2.Dex文件checksum(校验和)解析       DEX文件解析--3.d ...

  4. 围绕一个 volatile 关键字居然可以问出来 16 个问题

    对于 Java 每次面试就会想到多线程,多线程问题基本跑不了要问一下 volalite 关键字,可是我万万没想到居然一个 volatile 关键字可以连续问题出来 16 个问题!看下你能回答出来几个? ...

  5. 【JVM之内存与垃圾回收篇】堆

    堆 堆的核心概念 堆针对一个 JVM 进程来说是唯一的,也就是一个进程只有一个 JVM,但是进程包含多个线程,他们是共享同一堆空间的. 一个 JVM 实例只存在一个堆内存,堆也是 Java 内存管理的 ...

  6. 题解 CF997E 【Good Subsegments】

    先将问题进行转化,发现满足\((max-min)-(r-l)=0\)的区间即为好区间. 对于本题这样的统计子区间的问题,先将询问离线,按右端点排序一个一个解决,固定右端点,然后通过数据结构来处理出区间 ...

  7. Supervisor通用配置

    1.简介 supervisor是python开发的一个进程管理工具,可以将一个普通的命令行进程变为后台的守护进程,并且监控进程的运行状态,如果因为异常退出的时候会自动重启.它是通过fork/exec的 ...

  8. 图论相关知识(DFS、BFS、拓扑排序、最小代价生成树、最短路径)

    图的存储 假设是n点m边的图: 邻接矩阵:很简单,但是遍历图的时间复杂度和空间复杂度都为n^2,不适合数据量大的情况 邻接表:略微复杂一丢丢,空间复杂度n+m,遍历图的时间复杂度为m,适用情况更广 前 ...

  9. 黎曼函数ζ(2n)的几种求法

    \(\zeta (2n)\)的几种求法 目录 $\zeta (2n)$的几种求法 结论 欧拉的证明 进一步探索,$\zeta$ 函数.余切.伯努利数的关系 傅立叶分析证明 留数法证明 参考资料 结论 ...

  10. 记一次css字体反爬

    前段时间在看css反爬的时候,发现很多网站都做了css反爬,比如,设置字体反爬的(58同城租房版块,实习僧招聘https://www.shixiseng.com/等)设置雪碧图反爬的(自如租房http ...