先起一个 Sidecar 服务,一个PHP服务一个应用,和PHP服务部署在同一台机子,通过 localhost 访问,这样就解决了网络开销,相当于本地进程间调用

Sidecar 服务比较简单,

1、这里记录下 maven 的配置

<?xml version="1.0" encoding="UTF-8"?>
<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> <groupId>cn.taxiong</groupId>
<artifactId>tx_php_server_side_car</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging> <name>tx_php_server_side_car</name>
<description>Demo project for Spring Boot</description> <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties> <!--配置仓库-->
<repositories>
<repository>
<id>aliRepository</id>
<name>aliRepository</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories> <!-- cloud -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-sidecar</artifactId>
</dependency> <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build> </project>

2、sidecar 相关的配置,及注册中心的配置

spring:
application:
name: tx-php-server-sidecar #服务注册中心端口号
server:
port: 8203 #服务注册中心实例的主机名、端口
#是否向服务注册中心注册自己
#是否检索服务
#服务注册中心的配置内容,指定服务注册中心的位置
eureka:
port: 8200
instance:
hostname: localhost
client:
register-with-eureka: true
fetch-registry: true
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${eureka.port}/eureka/ sidecar:
port: 1215
instance:
hostname: localhost
health-uri: http://${sidecar.instance.hostname}:${sidecar.port}/health

3、服务启动类 @EnableSidecar

4、还需要在PHP服务一个检查服务的接口或文件, 注意响应头类型 Content-Type

以 laravel 框架为例子,配置后的地址是 http://127.0.0.1:1215/health

Route::get('health', function () {
$content = '{ "status" : "UP" }';
$status = 200;
$value = 'application/json; charset=utf-8';
return response($content, $status)
->header('Content-Type', $value);
});

这是通过 Eureka 中心页面,看见 Sidecar 已经注册上去,注意如果 PHP 的 health 页面的响应内容或者响应头不对的话, Sidecar 服务的 UP 状态会显示 DOWN

这里是 PHP 服务的默认页面

这里是通过 Spring Cloud gateway 转发后的 PHP 服务页面

服务间调用

一、PHP 服务调用 Java 服务的用法(调用host地址是Sidecar的地址,URi为服务名加接口地址,URi的拼装和Feign一样)

<?php
/**
* Created by PhpStorm.
* User: liugx
* Date: 2018/9/9
* Time: 下午12:57
*/ namespace App\Http\Controllers; use App\Exceptions\BusinessException;
use GuzzleHttp\Client; class TestController extends Controller
{
/**
* @return \Psr\Http\Message\StreamInterface
* @throws BusinessException
*/
public function test()
{
// Sidecar的端口号(本地调用)
$host = 'http://localhost:8203';
// 注册到Eureka的服务名称
$javaServiceName = 'tx-java-server';
// 要调用服务的接口URL
$func = '/';
// 通过Sidecar调用服务的URL
$uri = "/{$javaServiceName}{$func}"; $base_uri = $host;
$client = new Client([
// Base URI is used with relative requests
'base_uri' => $base_uri,
'timeout' => 3.0,
]);
$params = [];
try {
$response = $client->request('GET', $uri, [
'query' => $params
]);
} catch (\GuzzleHttp\Exception\GuzzleException $ex) { throw new BusinessException("抱歉,网络异常:{$ex->getMessage()}");
} return $response->getBody();
}
}

二、Java 服务调用 PHP 服务的用法

直接用FeignClient做服务间调用

SpringCloud初体验:三、Feign 服务间调用(FeignClient)、负载均衡(Ribbon)、容错/降级处理(Hystrix)

SpringCloud初体验:五、Sidecar 将 PHP 这类非 Java 生态语言的服务接入 Spring Cloud的更多相关文章

  1. SpringCloud初体验:前言

    体验了一天 SpringCloud 后发现,人们所讲的微服务架构不是一门技术,而是一种风格. 感觉确实可以这么认同,因为一套 SpringCloud 玩下来(未深入.未完整「链路追踪.动态刷新配置…… ...

  2. SpringCloud初体验:六、利用 Sleuth 和 Zipkin 给微服务加上链路监控追踪查看功能

    首先:装上 Zipkin 服务,收集调用链跟踪数据,体验时装在了本机docker上, 方便快捷 docker run -d -p : openzipkin/zipkin 安装后访问地址也是 9411端 ...

  3. SpringCloud初体验:四、API GateWay 服务网关

    网关服务很多,比如:Zuul.Kong.spring cloud gateway ……, 这里不纠结哪种性能好,本次体验是用的 spring cloud gateway 更多网关比较可以了解这篇文章: ...

  4. SpringCloud初体验:二、Config 统一配置管理中心

    Spring Cloud Config : 配置管理工具包,让你可以把配置放到远程服务器,集中化管理集群配置,目前支持本地存储.Git以及Subversion. 配置中心也区分为服务端和客户端,本次体 ...

  5. SpringCloud入门之应用程序上下文服务(Spring Cloud Context)详解

    构建分布式系统非常复杂且容易出错.Spring Cloud为最常见的分布式系统模式提供了简单易用的编程模型,帮助开发人员构建弹性,可靠和协调的应用程序.Spring Cloud构建于Spring Bo ...

  6. springcloud(十七):服务网关 Spring Cloud GateWay 熔断、限流、重试

    上篇文章介绍了 Gataway 和注册中心的使用,以及 Gataway 中 Filter 的基本使用,这篇文章我们将继续介绍 Filter 的一些常用功能. 修改请求路径的过滤器 StripPrefi ...

  7. SpringCloud初体验之Eureka

    Eureka简介 SpringBoot简化了Spring工程的复杂度,之前复杂的Spring工程被拆分成了一个个小的SpringBoot工程.那么SpringBoot之间如何通讯,相互获取信息呢?这就 ...

  8. SpringCloud初体验:一、Eureka 服务的注册与发现

    Eureka :云端服务发现,一个基于 REST 的服务,用于定位服务,以实现云端中间层服务发现和故障转移. Eureka 可以大致理解为 房产中介 和 房东 的关系,房东想让租客租房子,首先要把房子 ...

  9. SpringCloud初体验:七、gateway 网关服务如何做token验证

    说说背景:假如有一个用户服在用户登录后,生成一个token给到客户端,用户每次请求时都需要这个token,于是每次都会在网关 gateway 校验,校验通过后网关从token中解析出userId,然后 ...

随机推荐

  1. JFace下ApplicationWindow关闭窗口时结束进程

    /** * Configure the shell. * @param newShell */ @Override protected void configureShell(Shell newShe ...

  2. 获取URL中的链接(可中文也可英文)

    //既能获取中文url也能英文function getUrlParam(key) { // 获取参数 var url = window.location.search; // 正则筛选地址栏 var ...

  3. EhLib TitleButton SVisibleColumnsEh = '错误的列';

    unit EhLibConsts; interface resourcestring SClearSelectedCellsEh = '清除选择的单元?'; SInvalidTextFormatEh ...

  4. hdu 1253 胜利大逃亡 (代码详解)解题报告

    胜利大逃亡 Problem Description Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会. 魔王住在一个城堡里,城堡是一个A*B*C的立方体,可以被表示 ...

  5. 基于GUI的简单聊天室02

    服务器端 与上一篇相比,加进了线程内部类,解决多个客户端连接时,服务器无法全部响应的问题. 利用List集合来装载客户端的对象. 还需要注意全局变量的应用. /** * 相比01,加进了线程内部类,解 ...

  6. 在C++里一个类成员函数多少行代码才是最好呢?

    这个问题,很多同事以及学生都问我这个问题.其实这是一个比较实际的问题,因为设计一个类成员函数的好与坏,决定了一个类代码的质量. 为了回答这个问题,昨晚又重新看看斯坦福大学的编程视频,可以用下面这个截图 ...

  7. OpenCV 图像旋转实现

    1 旋转矩形 首先建议阅读图像旋转算法原理-旋转矩阵,这篇博客可以让你很好地理解图像中的每一个点是如何进行旋转操作的.其中涉及到了图像原点与笛卡尔坐标原点之间的相互转换以及点旋转的一些公式推导. 这里 ...

  8. 【linux基础】vim多窗口功能

    前言 实现多个文档文件在同一个屏幕上显示多个窗口. 实现过程 在指令列模式输入『:sp {filename}』即可!那个 filename 可有可无, 如果想要在新窗口启动另一个文件,filename ...

  9. 【error】segmentation fault分析

    前言 调试代码的时候,可能会出现segmentation fault的bug,很难找到原因,在此总结一下可能的原因. SIGSEGV 原因分析 1.程序中的变量没有进行检查: 比如,没有对变量的大小进 ...

  10. stm32 内部温度传感器的配置

    STM32的内部温度传感器和ADCx—IN16输入通道相连接.且温度传感器推荐采样时间为17.1us,支持的温度范围为:-40~125度,精度比较差,± 5℃左右. 计算温度值:T(℃) ={(V25 ...