一、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 ,否者远程调用无法根据服务的名称找到服务