通过sidecar模式,将ssh、或非java的web应用接入springcloud集群上。
1、独立出一个springboot,用于sidecar。
@EnableSidecar @SpringBootApplication public class SidecarApplication { public static void main(String[] args) { SpringApplication.run(SidecarApplication.class, args); } }
application.yml:
server: port: 5678 spring: application: name: sidecar sidecar: # 配置接入web的端口 port: 8090 home-page-uri: http://localhost:${sidecar.port}/sshweb # 配置接入web的健康检查rest接口,sidecar将请求该url,用以确定接入应用是否存活. health-uri: http://localhost:${sidecar.port}/sshweb/api/health/status
2、接入web应用自行实现该rest方法
@RequestMapping(value = "/api/health/status", method = RequestMethod.GET) @ResponseBody<br> public String status() { return {\"status\":\"UP\"}; }
security配置文件上,将该rest接口作为非拦截项目
3、springboot访问接入web项目时,使用Feign方式
@FeignClient(name = "sidecar") public interface SidecarDemoFeignClient { @RequestMapping("/sshweb/api/boottest/get") public String get(@RequestParam("name") String name); }4、接入项目访问spring-boot-client的方法
HttpClientUtil.synchGet(new URI("http://localhost:5678/springboot-service-id/api/demo/invoke"));
接入项目请求springboot-client应用时,host和port配置为sidecar的,请求会经由sidecar进行请求转接到对应的boot-client上。
假定springboot-service-id上有如下应用
@RequestMapping("/api/invoke/web") @ResponseBody public String invokeByNormalWeb() { return "这是个神马"; }
5、负载还是有点问题。
如果接入应用非java应用、或者由于版本过低无法引用DiscoveryManager来获取eureka上的服务器列表的话,甚至于eurekaserver屏蔽了服务列表的rest接口,那么只能使用nginx等反向代理工具,形成web项目<->nginx-<->sidecar模式了。如果eurekaserver没屏蔽服务列表获取的rest接口,自己做个balance选择器也没毛病