分布式之远程调用

一、Spring cloud中使用Http+Resful+Json进行调用

1. restful是什么:用于设计web服务(controller @ResponseMapping("/list"))的规范。

之前:http协议 (罗伊*菲尔丁)

http://127.0.0.1:8080/getStudent 不符合restful
增加学生,可能是:/addNewStudent
更新学生,可能是:/updateStudent
删除学生,可能是:/deleteStudent?id=xx
删除所有学生,可能是:/deleteStudents
获取三好学生,可能是:/getSanHaoStudents

现在:restful 操作与资源进行分离 http 请求方式GET、POST、PUT、DELTE。

GET 方法从资源请求数据,不应产生任何其他作用。
例如/schools/清华/students,返回所有清华大学的学生
/schools/清华/students/1,返回某个清华大学的学生


POST方法请求服务器在数据库中创建资源,主要是在提交Web表单时。
/schools/清华/students/张三,在清华大学的学生资源,新增一个张三的学生。POST是非幂等的,这意味着多个请求将具有不同的效果。


PUT方法请求服务器更新资源或创建资源(如果不存在)。
/schools/清华/students/张三, 对清华大学下的学生资源中,更新或者创建张三。PUT是幂等的,这意味着多个请求将具有相同的效果。


DELETE方法请求从数据库中删除资源或其实例。
/schools/清华/students/张三,从清华大学的学生集合中,删除学生张三的资源。

2.HTTP协议
1)请求报文:(请求行/请求头/请求数据/空行)

请求行
请求方法字段、URL字段和HTTP协议版本
例如:GET /index.html HTTP/1.1
get方法将数据拼接在url后面,传递参数受限
请求方法:GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT


请求头(key value形式)
User-Agent:产生请求的浏览器类型。
Accept:客户端可识别的内容类型列表。
Host:主机地址


请求数据
post方法中,会把数据以key value形式发送请求


空行
发送回车符和换行符,通知服务器以下不再有请求头。

2)响应报文(状态行、消息报头、响应正文)
状态行(协议、响应码 、响应信息)
消息报头(是否缓存,是否保持长连接…)
响应正文(数据)

二、分布式系统如何进行远程调用(一个节点调用另外一个节点的接口)

1.java socket框架:httpclient、OkHttp
2.RPC远程调用框架:

几种比较典型的RPC的实现和调用框架。
(1)RMI实现,利用java.rmi包实现,基于Java远程方法协议(Java Remote Method Protocol)?和java的原生序列化。
(2)Hessian,是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能。 基于HTTP协议,采用二进制编解码。
(3)thrift是一种可伸缩的跨语言服务的软件框架。thrift允许你定义一个描述文件,描述数据类型和服务接口。依据该文件,编译器方便地生成RPC客户端和服务器通信代码。
(4)SpringCloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等。
(5) Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成。

三、使用socket原生的httpclient进行远程调用

1、spring封装的对restful接口的调用的模板类:RestTemplate
2、存在问题:存在硬编码 ----请求地址是ip地址
3、命名服务的框架来解决这个问题:zookepper、spring cloud eureka

四、服务注册与服务发现(eureka)

用于服务注册与发现的框架:
1、apache zookeeper
2、spring cloud eureka、consul
3、阿里开源 Nacos

五、eureka的服务端配置

第1步:加入eureka的依赖

<properties>
    <spring-cloud.version>Hoxton.SR8</spring-cloud.version>
    <java.version>1.8</java.version>
</properties>


<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

第2步:spring boot启动类上加入@EnableEurekaServer

第3 步:配置eureka服务端

#eureka的服务端
server.port=8888
        

eureka.instance.hostname=localhost
#客户端调用eureka服务端的url
eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/

# eureka server 没必要自己把自己注册上去,所以可以设置成 false
eureka.client.register-with-eureka=false
# 是否从Eureka Server上获取注册信息,默认为true,此处建议修改成 false
# (单机设置的意义不大,如果设置成 true 启动会去抓取一次注册表,获取不到更新缓存就会出错(该错误不影响 eureka 正常使用))
eureka.client.fetch-registry=false

第4步:浏览器http:localhost:8888

六、eureka的客户端的配置

第1步:加入eureka客户端依赖

<properties>
    <spring-cloud.version>Hoxton.SR8</spring-cloud.version>
    <java.version>1.8</java.version>
</properties>


<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

第2步:spring boot启动类上加入@EnableEurekaClient

第3 步:配置eureka客户端

#需要配置到eurekaserver的服务名称
spring.application.name=service-product

#服务注册到eureka注册中心的地址
eureka.instance.hostname=localhost

eureka.client.serviceUrl.defaultZone=http://localhost:8888/eureka/


###因为该应用为服务提供者,是eureka的一个客户端,需要注册到注册中心
eureka.client.register-with-eureka=true
###是否需要从eureka上检索服务
eureka.client.fetch-registry=true

第4 步:远程调用
restTemplate.getForObject(“http://服务名称/product”, Product[].class);

注意:RestTemplate进行远程调用在RestTemplate的Bean注解上加入
@LoadBalanced //负载均衡 ribbon ,否者远程调用无法根据服务的名称找到服务

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值