公司最近在进行微服务架构调整,准备把各种语言上跑的项目整合到一起
还在调研各种框架,之前在看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服务
启动客户端
七.页面效果
注册中心页面:
访问localhost:8011/helloGo:
八.总结
sidecar用起来比etcd+grpc舒服多了
也可能是我习惯用java的原因
不管怎么说用springcloud全家桶好多东西都会方便很多
考虑要不要再记录下java上的etcd+grpc
也不知道公司到底会选什么框架
明天上班再说吧 下班了~