公司最近在进行微服务架构调整,准备把各种语言上跑的项目整合到一起
还在调研各种框架,之前在看etcd+grpc
今天看了看sc的sidecar
记录下简单的流程

一.Sidecar简介



Spring Cloud Netflix Sidecar 包含一个简单的http api来获取给定服务的所有实例(即主机和端口)。然后可以通过从Eureka获取其路由条目的嵌入式Zuul代理来代理服务调用。可以通过主机查找或通过Zuul代理访问Spring Cloud Config服务器。但是第三方程序必须执行健康检查,以便Sidecar可以向应用程序启动或关闭时向eureka报告。

上面是网上找的介绍,简单来说大概就是Sidecar可以拿到各种异构语言上面服务的所有信息,并将之兼容到springcloud框架中
重点是需要给异构语言加一个模仿springboot健康检查接口的可访问uri,返回一个json文档
{ status: 'UP' } 就是这玩意
注意一定要是json文档,直接return一个str是不行

二.第三方程序



这里第三方程序用go来编写 公司要求我也没办法 真的不是很熟悉 所以代码很简单

package main

import (
	"encoding/json"
	"fmt"
	"log"
	"net/http"
)

func sayhelloName(w http.ResponseWriter, r *http.Request) {
	r.ParseForm() //解析参数,默认是不会解析的
	m := map[string]string{"status": "UP"} //json文本
	mjson, _ := json.Marshal(m)
	w.Header().Set("Content-Type", "application/json") //设置输出格式 必须是Json
	w.Write(mjson)
}
//模拟go语言方法 方便java端调用测试
func sayhelloWorld(w http.ResponseWriter, r *http.Request) {
	r.ParseForm()
	fmt.Fprintf(w, "这是来自Go的服务!HelloGo(8060)")
}
func main() {
	http.HandleFunc("/health.json", sayhelloName) //设置访问的路由
	http.HandleFunc("/helloWorld", sayhelloWorld) 
	err := http.ListenAndServe(":8060", nil)      //设置监听的端口
	if err != nil {
		log.Fatal("ListenAndServe: ", err)
	}
}

第三方程序原有服务都不用做改变,只需要添加一个返回json文本的方法即可

三.Sidecar服务

Step1.创建一个Maven项目

略…

Step2.配置文件application.properties

server.port=8013
spring.application.name=rpc-sidecar
eureka.client.serviceUrl.defaultZone=http://localhost:8010/eureka/
sidecar.port=8060
sidecar.health-uri=http://localhost:${sidecar.port}/health.json

前三个配置没啥好说的
后两个一个是监听的第三方程序端口号
一个是健康检查接口的路径

Step3.启动类

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

@EnableSidecar注解整合了@EnableCircuiBreaker,@EnableDiscoveryClient和@EnableZuulProxy
打上就好,没啥好说的

Step4.配置文件pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<artifactId>rpc-sidecar</artifactId>
	<parent>
		<groupId>com.kami</groupId>
		<artifactId>rpc-parent</artifactId>
		<version>0.0.1-SNAPSHOT</version>
	</parent>
	<dependencies>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-netflix-sidecar</artifactId>
		</dependency>
	</dependencies>
</project>

只用加一个依赖即可,parent是多选的,应该用不到

四.模拟客户端

和普通springcloud项目没太大区别

@FeignClient("rpc-sidecar")
public interface GoController {
	@RequestMapping("/helloWorld")
	public String helloWorld();
}
@Controller
public class SidecarController {
	
	@Autowired
	private GoController goController;
	
	@ResponseBody
	@RequestMapping("/helloGo")
	public String helloGo() {
		return goController.helloWorld();
	}
}

五.注册中心

和普通springcloud项目没区别,略

六.运行顺序

启动第三方服务程序
启动注册中心
启动sidecar服务
启动客户端

七.页面效果

注册中心页面:

springCloud validation国际化 springcloud go_ide

访问localhost:8011/helloGo:

springCloud validation国际化 springcloud go_sidecar_02

八.总结

sidecar用起来比etcd+grpc舒服多了
也可能是我习惯用java的原因
不管怎么说用springcloud全家桶好多东西都会方便很多
考虑要不要再记录下java上的etcd+grpc
也不知道公司到底会选什么框架
明天上班再说吧 下班了~