rest 订阅
rest,英文单词,动词、名词,作动词时意为“使)休息;(使)运动员暂时离队;(使)倚靠;被搁置;(遗体或尸体)安葬于;让(土地)休耕;(原告或被告)完成向法庭提出证据(或辩论);归属于;保持不变”,作名词时意为“休息;睡眠;静止;休止;休止符;(演说中的)停顿;(诗句中的)停顿;休息处;支架;剩余部分;其余的人(或物);(器官或组织的)一小碎块;(网球)对打,(美)雷斯特(人名)”。 展开全文
rest,英文单词,动词、名词,作动词时意为“使)休息;(使)运动员暂时离队;(使)倚靠;被搁置;(遗体或尸体)安葬于;让(土地)休耕;(原告或被告)完成向法庭提出证据(或辩论);归属于;保持不变”,作名词时意为“休息;睡眠;静止;休止;休止符;(演说中的)停顿;(诗句中的)停顿;休息处;支架;剩余部分;其余的人(或物);(器官或组织的)一小碎块;(网球)对打,(美)雷斯特(人名)”。
信息
外文名
rest
词    性
名词、动词
rest单词发音
英[rest]美[rest] [1] 
收起全文
精华内容
参与话题
问答
  • REST

    千次阅读 2019-04-02 22:15:04
    REST,即Representational State Transfer的缩写,翻译为“表现层状态转化”,如果一个架构符合REST原则,则称其为RESTful架构。 资源(Resources) REST的名称“表现层状态转化”,表现层指的是“...

    REST简介

    REST,即Representational State Transfer的缩写,翻译为“表现层状态转化”,如果一个架构符合REST原则,则称其为RESTful架构。

    • 资源(Resources)
      REST的名称“表现层状态转化”,表现层指的是“资源”的“表现层”。

    所谓“资源”,就是网络上的一个实体,或者说是网络上的一个具体信息,它可以是一段文本、一张图片、一首歌曲、一种服务,总之就是一个具体的实体。可以用一个具体的URI(统一资源定位符)指向它,每种资源对应一个特定的URI。要获取这个资源,访问它的URI就可以。
    因此URL就成了每个资源的地址或第一无二的标识符。

    • 表现层

    “资源”是一种信息实体,可以有多种外在表现形式。将“资源”具体呈现出来的形式称之为“表现层”。比如,文本可以用txt格式表现,也可用HTML格式、XML格式、JSON格式等。

    URI只代表资源的实体,不代表它的形式。它的具体表现形式应该在HTTP请求的头信息中用Accept和Content-Type字段指定。

    • 状态转化
      访问一个网站。就代表了客户端和服务器的一个互动过程,这个过程中,势必涉及和状态的变化。

    HTTP协议是一个无状态互联网通信协议,这意味着所有的状态都保存在服务器端。因此,如果客户端想要操作服务器,必须通过某种手段,让服务器端发生“状态转化”。而这种转化是建立在表现层之上的,所以就是“表现层状态转化”。

    URI:统一资源标识符
    URL:统一资源定位符
    

    REST风格的架构

    包括了REST架构中如何标识资源,如何标识操作接口以及操作的版本,如何标识操作的结果等,如:

    • 使用“api”作为web上下文;
    • 增加版本标识;
    • 标识资源;
    • REST中的HTTP Method;
    • REST中的HTTP Status;

    使用“api”作为上下文

    建议使用“api”作为上下文,如:

    http://localhost/api
    http://api.xxx.com
    

    增加一个版本标识

    http://localhost/api/v1.1
    

    标识资源

    将资源名称放到URL中,如果资源有层级关系,则放入层级关系:

    http://localhost:/api/v1.1/user
    //如果用户属于系统管理,则:
    http://localhost:/api/v1.1/system/user
    

    确定HTTP Method

    在REST中,HTTP Method通常对应以下含义:

    • POST:代表增加资源;
    • PUT:代表更改资源,客户端提供完整的资源属性;
    • GET:代表查询资源;
    • PATCH:更新资源,客户端提供仅需要更改的资源属性;
    • DELETE:删除资源;
    • OPTIONS:用于获取URI所支持的方法,响应信息会在HTTP头中包含一个名为“Alllow”的头,值是所支持的方法,如“GET”、“POST”。

    在业务系统中,删除往往不是指物理删除,而是逻辑删除,资源通常仍在数据库中,只是状态设置为删除状态。

    确定HTTP Status

    服务器向客户端返回HTTP Status以表示操作是否成功,常用的如下:

    • 200,OK,用户请求成功,如查询数据成功返回。
    • 400,错误的请求,如URI匹配上的Controller,但是方法参数匹配错误,就会抛出错误。
    • 404NOT Found,用户发出的请求针对的资源不存在。通常是Controller没有匹配上URI,或者匹配上了Controller方法,但渲染的视图不存在。
    • 405,用来访问本页面的HTTP Method不被允许,比如通过HTTP GET方式访问了一个@PostMapping的Controller方法。
    • 406,表示无法使用请求的内容来响应请求的资源,如请求后缀以html结尾,但同时请求的HTTP头中又包含了Accept:application/json。
    • 500,服务器内部错误,无法完成请求,通常是Controller抛出的错误。
    展开全文
  • Rest

    千次阅读 2020-01-21 20:13:10
    REST(REpresentational State Transfer)是一种设计网络应用时的架构风格,以抽象的“资源(Resource)”为中心,各个模块之间通过转移(Transfer)沟通资源的"表态状态(Representational State)"来实现应用的...

    REST(REpresentational State Transfer)是一种设计网络应用时的架构风格,以抽象的“资源(Resource)”为中心,各个模块之间通过转移(Transfer)沟通资源的"表态状态(Representational State)"来实现应用的功能,从而使网络应用得以简易性,扩展性,可靠性等。

    RESTful API有助于客户端和服务端的功能分离,服务器完全扮演着一个“资源服务商”的角色。各种不同的客户端都可以通过一致的API与这个“资源服务商”交流,从而与资源进行互动。

    REST暴露的是“接口资源”,而不是“接口操作”。

    RESTful API(具有REST风格的API):用URL(资源ID)定位每一个页面(资源),用HTTP动词(GET、HEAD、POST、PUT、PATCH、DELETE)描述操作资源,用响应状态码表示操作结果。但是REST远远不仅是指API的风格,它是一种网络应用的架构风格。

    在这里插入图片描述
    架构风格描述了六个约束。应用于体系结构的这些约束最初由Roy Fielding在他的博士论文中传达,并定义了RESTful的基础样式。

    1. 客户端和服务端的分割:REST 构架要求是基于客户端和服务端的。通过一个统一的接口来分开客户端和服务器,使得两者可以独立开发和演化。客户端不关心数据的存储,而服务端不关心用户的交互和会话的状态。这样可以做到客户端的可替换性,和服务端的兼容性。

    2. 统一接口(客户端和服务端之间通信的统一规范性):

    • 所有的通信都是基于资源的,通信的内容都是资源的表征状态;
    • 客户端通过表征状态就可以创建读取修改资源;
    • 所有的通信都是自解释的,每条消息都有足够的信息来告诉对方自己应该被如何解析;
    • 使用超媒体来作为传送的表征状态;服务端往往会在表征状态中加入其他资源链接的方式让客户端可以在下一次通信中获取其他资源。
    1. 分层的系统(客户端和服务端直接可以插入很多层):这样服务端可以被很容易地扩展为负载平衡服务器组来处理安全策略和缓存等相关问题,客户端并不需要了解中间的这些层次的细节。

    2. 无状态(服务端是无状态的):符合REST风格的服务端不应该保存任何用户状态,而是在客户端保存用户会话的状态。这样的好处是明显降低服务器开销,提高快速错误恢复的能力。

    3. 可缓存。客户端可以缓存服务器返回的响应结果。服务器可以定义响应结果的缓存设置。

    4. 按需代码(服务端给客户端按需提供Code资源):这是一个可选风格,但是它在很多REST应用中却非常重要,因为它使得不改变客户端就可以扩展客户端的功能。简单的说,这种风格是将逻辑代码也看成是一种资源,可以自由从服务端取得,并到客户端上面执行。比如浏览器从服务端下载一段javascript 代码资源,并执行它来达到用户的某个需求。

    以上的6条属性中,除了第6条以外,其它的任意一条不满足的服务就不能被称作REST服务。

    RESTful的CRUD

    @RequestMapping:通过设置method属性的CRUD,可以将同一个URL映射到不同的HandlerMethod方法上。
    @GetMapping、@PostMapping、@PutMapping、@DeleteMapping注解同@RequestMapping注解的method属性设置。

    RESTful的URL路径变量

    @PathVariable:可以解析出来URL中的模板变量({id}/{name})

    // URL:http://localhost:8080/ssm/cyb/item/1/zhangwenhui
    
    // Controller层:
    
    @RequestMapping("{id}/{name}")
    @ResponseBody
    public Item queryItemById(@Pathvariable Integer id,@PathVariable String name){
    ……
    }
    
    展开全文
  • rest

    2014-05-16 14:42:29
    dlee : 主题:关于REST一些最新的业界动态 时间:2007-06-02 关键字: REST  robbin : 主题:从分布式系统的角度看REST 时间:2007-05-23  AllenYoung : 主题:关于REST的一点想法,欢迎大家讨论。时间:...

    【虎.无名】从javaeye上看到三篇文章:
    dlee : 主题:关于REST一些最新的业界动态 时间:2007-06-02 关键字: REST 
    robbin : 主题:从分布式系统的角度看REST 时间:2007-05-23 
    AllenYoung : 主题:关于REST的一点想法,欢迎大家讨论。时间:2007-04-11

    1,首先,最重要的是,Sun启动了JSR 311的开发过程:http://www.infoq.com/news/2007/02/jsr-311-java-rest-api 和 JSR 311: JAX-RS: The Java API for RESTful Web Services 这个JSR的开发还请了目前最成熟的Java REST框架Restlet的作者Jerome Louvel参与到其中,Restlet API很有可能会被JCP采纳作为制定这个新标准的基础。 
    孟岩前一段时间告诉我: 我刚刚从美国回来,参加了IBM Impact 07大会,现在IBM已经把REST放在SOA整个的战略框架之中来考虑,因此很快会出现商业的REST支持产品。 
    M$前一段时间刚刚发布他们的REST风格的Web服务解决方案Astoria:http://www.infoq.com/cn/news/2007/05/astoria 
    Nokia也将REST作为他们服务器端整体架构中的一个重要的部分:http://www.ftponline.com/conferences/virtual/wb20/2006/materials/Development/RemoteControlforWEB20.pdf 此外还有很多公司对REST感兴趣,我的一个在BO(http://www.businessobjects.com/)的朋友说他们现在做的项目已经有一半都是基于REST了,我的另一个在毕博软件的朋友说他们也对REST很感兴趣。 
    O'Reilly最近出版了一本关于REST的专著:RESTful Web Services http://www.oreilly.com/catalog/9780596529260/

    2,REST最大的特点是什么呢?REST是为通过HTTP协议来进行分布式调用量身定造的架构。传统上,我们开发一个非分布式的软件系统,使用OO进行建模和架构,无往而不利。但是分布式对象却显得不那么有效。对于跨进程的调用,也许我们需要探索更好的面向对象的分布式调用架构。 REST是专门为分布式调用设计的架构,在REST里面,分布式是通过对资源的操作来实现的,不是像EJB那样通过对象的方法调用来实现的。资源是一种抽象的概念,资源被映射到相应的一套URL规则上面了。所以资源只和URL相关,而与具体实现无关,因此REST具有更好的解藕性。在RoR的实现当中,你可以把一些资源直接映射到model对象上面去,也可以不映射到model上面,而完全是由业务逻辑组合的抽象资源。

    3,REST提出了一些设计概念和准则:

    1. 网络上的所有事物都被抽象为资源(resource);【REST通过URI暴露资源,而不是通过消息接口暴露服务】
    2. 每个资源对应一个唯一的资源标识(resource identifier); 【虎.无名:id不一定是数字,也可是任意字符串,包括中文。完整的资源id实质是一个URI】
    3. 通过通用的连接器接口(generic connector interface)对资源进行操作;【虎.无名:会HTTP就行】
    4. 对资源的各种操作不会改变资源标识; 【虎.无名:URL的一致性,便于搜索引擎优化。SEO】
    5. 所有的操作都是无状态的(stateless)。 【虎.无名:这点比较难,很多地方需要重构,尤其设计用户登录、权限、会话等部分,要求通过其它方式,每次访问都含有有效登录信息,自动登录。】

    REST之所以能够简化开发,是因为其引入的架构约束,比如Rails 1.2中对REST的实现默认把controller中的方法限制在7个:index、show、new、edit、create、update和destory,这实际上就是对CURD的实现。更进一步讲,Rails(也是当今大部分网络应用)使用HTTP作为generic connector interface,HTTP则把对一个url的操作限制在了4个之内:GET、POST、PUT和DELETE。
    REST之所以能够提高系统的可伸缩性,是因为它强制所有操作都是stateless的,这样就没有context的约束,如果要做分布式、做集群,就不需要考虑context的问题了。同时,它令系统可以有效地使用pool。REST对性能的另一个提升来自其对client和server任务的分配:server只负责提供resource以及操作resource的服务,而client要根据resource中的data和representation自己做render。这就减少了服务器的开销。
    既然REST有这样的好处,那我们应该义无反顾地拥抱它啊!目前一些大牛(像DHH)都已经开始投入到了REST的世界,那我们这些人应该做什么或者说思考写什么你呢?我觉得我们应该思考两个问题:1)如何使用REST;2)REST和MVC的关系。 第一个问题假设REST是我们应该采用的架构,然后讨论如何使用;第二个问题则要说明REST和当前最普遍应用的MVC是什么关系,互补还是取代?

    我们先来谈谈第一个问题,如何使用REST。我感觉,REST除了给我们带来了一个崭新的架构以外,还有一个重要的贡献是在开发系统过程中的一种新的思维方式:通过url来设计系统的结构。根据REST,每个url都代表一个resource,而整个系统就是由这些resource组成的。因此,如果url是设计良好的,那么系统的结构就也应该是设计良好的。对于非高手级的开发人员来说,考虑一个系统如何架构总是一个很抽象的问题。敏捷开发所提倡的Test Driven Development,其好处之一(我觉得是最大的好处)就是可以通过testcase直观地设计系统的接口。比如在还没有创建一个class的时候就编写一个testcase,虽然设置不能通过编译,但是testcase中的方法调用可以很好地从class使用者的角度反映出需要的接口,从而为class的设计提供了直观的表现。这与在REST架构中通过url设计系统结构非常类似。虽然我们连一个功能都没有实现,但是我们可以先设计出我们认为合理的url,这些url甚至不能连接到任何page或action,但是它们直观地告诉我们:系统对用户的访问接口就应该是这样。根据这些url,我们可以很方便地设计系统的结构。
    让我在这里重申一遍:REST允许我们通过url设计系统,就像Test Driven Development允许我们使用testcase设计class接口一样。OK,既然url有这样的好处,那我们就着重讨论一下如何设计url。网络应用通常都是有hierarchy的,像棵大树。我们通常希望url也能反映出资源的层次性。比如对于一个blog应用:/articles表示所有的文章,/articles/1表示id为1的文章,这都比较直观。遗憾的是,网络应用的资源结构永远不会如此简单。因此人们常常会问这样一个问题:RESTful的url能覆盖所有的用户请求吗?比如,login如何RESTful?search如何RESTful?
    从REST的概念上来看,所有可以被抽象为资源的东东都可以使用RESTful的url。因此对于上面的两个问题,如果login和search可以被抽象为资源,那么就可以使用RESTful的url。search比较简单,因为它会返回搜索结果,因此可以被抽象为资源,并且只实现index方法就可以了(只需要显示搜索结果,没有create、destory之类的东西)。然而这里面也有一个问题:search的关键字如何传给server?index方法显然应该使用HTTP GET,这会把关键字加到url后面,当然不符合REST的风格。要解决这个问题,可以把每次search看作一个资源,因此要创建create和index方法,create用来在用户点击“搜索”按钮是通过HTTP POST把关键字传给server,然后index则用来显示搜索结果。这样一来,我们还可以记录用户的搜索历史。使用同样的方法,我们也可以对login应用REST,即每次login动作是一个资源。
    现在,我们来复杂一些的东东。如何用url表达“category为ruby的article”?一开始可能想到的是/category/ruby/articles,这种想法很直观。但是我觉得里面的category是不需要的,我们可以直接把“/ruby”理解为“category是ruby”,也就是说“ruby”出现的位置说明了它指的就是category。OK,/ruby/articles,单单从这个url上看,我们能获得多少关于category的信息呢?显然category隐藏在了url后面,这样做到底好不好,应该是仁者见仁,智者见智了。对于如何表达category这样的东西,我还没想出很好的方式,大家有什么好idea,可以一起讨论。
    另外还有一种url形式,它对应到程序中的继承关系。比如product是一个父类,book和computer是其子类。那么所有产品的url应该是/products,所有书籍的url应该是/books,所有电脑的url应该是/computers。这一想法就比较直观了,而且再次验证了url可以帮助我们进行设计的论点。
    让我再说明一下我的想法:如果每个用户需求都可以抽象为资源,那么就可以完全使用REST。
    由此看来,使用REST的关键是如何抽象资源,抽象得越精确,对REST的应用就越好。因此,如何改变我们目前根深蒂固的基于action的思想是最重要的。
    有了对第一个问题的讨论,第二个问题就容易讨论多了。REST会取代MVC吗?还是彼此是互补关系(就像AOP对于OOP)?答案是It depends!如果我们可以把所有的用户需求都可以抽象为资源,那么MVC就可以推出历史的舞台了。如果情况相反,那么我们就需要混合使用REST和MVC。当然,这是非常理想的论断。可能我们无法找到一种方法可以把所有的用户需求都抽象为资源,因为保证这种抽象的完整性(即真的是所有需求都可以)需要形式化的证明。而且即使被证明出来了,由于开发人员的能力和喜好不同,MVC肯定也会成为不少人的首选。但是对于希望拥抱REST的人来说,这些都没有关系。只要你开发的系统所设计的问题域可以被合理地抽象为资源,那么REST就会成为你的开发利器。
    所以,所有希望拥抱REST的朋友们,赶快训练自己如何带上资源的眼镜看世界吧,这才是REST的核心所在。

    http://foo.extremepattern.com/index.php?title=Hello_REST wiki: Hello REST
    。。。REST 是一種風格 Style,不是一種技術 Technology。
    http://foo.extremepattern.com/index.php?title=Hello_Restlet wiki:Hello Restlet 
    。。。在整個嘗試過程中,最讓人難以確認是否做好的部份是在 URI 的設計,它必須是資源的獨一無二的地址,至於 Uniform Interface 的限制,反而容易做到,因為只有四個動詞。RESTify DayTrader 一文做了很好的示範,示範如何將動詞取出,分析名詞,設計 URI 標示資源與資源的操作方式。 
    。。。How to Create a REST Protocol這篇文章提供很好的指引,這裡列出 RESTful Web Services 書中的建議步驟。 【虎.无名:推荐一看 http://www.xml.com/pub/a/2004/12/01/restful-web.html

    1. Figure out the data set
    2. Split the data set into resources
    3. Name the resuorces with URIs
    4. Expose a subset of the uniform interface
    5. Design the representation(s) accepted from the client
    6. Design the representation(s) served to the client
    7. Integrate this resource into existing resources, using hypermedia links and forms
    8. Consider the typical course of events:what's supposed to happen?
    9. Consider error conditions: what might go wrong?

    HTTP Method CRUD Action Description POST CREATE Create a new resource GET RETRIEVE Retrieve a representation of a resource PUT UPDATE Update a resource DELETE DELETE Delete a resource

    We'll update our table for our employee contact list to include the expected status codes

    Resource Method Representation Status Codes Employee GET Employee Format 200, 301永久重定向, 410永久不可用 Employee PUT Employee Format 200, 301, 400错误请求, 410 Employee DELETE N/A 200, 204无消息体 All Employees GET Employee List Format 200, 301 All Employees POST Employee Format 201成功创建, 400

    Warning Signs

    Even following these steps, you could still make some mistakes. Paul Prescod has created a list of Common REST Mistakes that is worth reviewing as you work on your protocol.

    http://www.prescod.net/rest/mistakes/ 【虎.无名:需要重视】When designing your first REST system there are a variety of mistakes people often make. I want to summarize them so that you can avoid them. If any are unclear, ask for more information on rest-discuss.

    1. Using HTTP is not enough. 【虎.无名:不仅仅把HTTP当作传输协议,而是一个应用协议。充分利用HTTP头信息和响应码。】
    2. Do not overuse POST. 【虎.无名:不要过渡使用POST方法,按需要使用DELETE和PUT,如果浏览器不支持,可以考虑客户端用ajax技术来实现。】
    3. Do not depend on URI's internal structure. 【虎.无名:URI是用户接口,只和用户需求相关,无需将URI绑定内部数据结构或数据库接口】
    4. Do not put actions in URIs. 【虎.无名:URI只和资源(名词)相关,与行为(动词)无关。】
    5. Services are seldom resources. 【虎.无名:服务很少是资源?一个资源可支持多种服务。也可这么理解:资源是一个类,而服务是类的一个方法。】
    6. Sessions are irrelevant. There should be no need for a client to "login" or "start a connection." HTTP authentication is done automatically on every message. Client applications are consumers of resources, not services. Therefore there is nothing to log in to! Let's say that you are booking a flight on a REST web service. You don't create a new "session" connection to the service. Rather you ask the "itinerary creator object" to create you a new itinerary. You can start filling in the blanks but then get some totally different component elsewhere on the web to fill in some other blanks. There is no session so there is no problem of migrating session state between clients. There is also no issue of "session affinity" in the server (though there are still load balancing issues to continue). 【虎.无名:登录认证似乎需要独立于REST系统,在前端WebServer上完成?】
    7. Do not invent proprietary(私有的) object identifiers. Use URIs. URIs are important because you can always associate information with them in two ways. 1)The simplest way is to put data on a web server so that the URI can be dereferenced in order to get the data. Note that this technique only works with URIs that can be dereferenced so these URIs (http URIs!) are strongly preferred to URN or UUID-based URIs. 2)Another way is to use RDF and other techniques that allow you to project metadata onto a URI that may not be under your control.
      If you use URI syntax with UUIDs or something like that then you get half of the benefit of URIs. You get a standardized syntax but have no standardized dereferencing capability. If you use an HTTP URI then you get the other half of the benefit because you then also have a standardized derferencing mechanism. 【虎.无名:没太明白,不要发明私有对象ID?】
    8. Do not worry about protocol independence. There exists only one protocol which supports the proper resource manipulation semantics. If another one arises in the future, it will be easy to keep your same design and merely support the alternate protocol's interface. On the other hand, what people usually mean by "protocol independence" is to abandon resource modelling and therefore abandon both REST and the Web. 【虎.无名:HTTP协议本身已经足够通用了】

    Overall, the thing to keep in mind is that REST is about exposing resources through URIs, not services through messaging interfaces.【REST通过URL暴露资源,而不是通过消息接口暴露服务。虎.无名:暴露一个资源,是不是意味着该资源的所有操作都需要暴露?】

    展开全文
  • 转载请标明出处: http://blog.csdn.net/forezp/article/details/69788938 本文出自方志朋的博客 在上一篇文章,讲了服务的注册和...Spring cloud有两种调用方式,一种是ribbon+restTemplate,另一种是feign。在这

    转载请标明出处:
    https://www.fangzhipeng.com/springcloud/2017/06/02/sc02-rest-ribbon.html
    本文出自方志朋的博客

    个人博客纯净版:https://www.fangzhipeng.com/springcloud/2017/06/02/sc02-rest-ribbon.html

    最新Finchley版本:
    https://www.fangzhipeng.com/springcloud/2018/08/02/sc-f2-ribbon.html
    或者
    http://blog.csdn.net/forezp/article/details/81040946

    在上一篇文章,讲了服务的注册和发现。在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于http restful的。Spring cloud有两种服务调用方式,一种是ribbon+restTemplate,另一种是feign。在这一篇文章首先讲解下基于ribbon+rest。

    一、ribbon简介

    Ribbon is a client side load balancer which gives you a lot of control over the behaviour of HTTP and TCP clients. Feign already uses Ribbon, so if you are using @FeignClient then this section also applies.

    -----摘自官网

    ribbon是一个负载均衡客户端,可以很好的控制htt和tcp的一些行为。Feign默认集成了ribbon。

    ribbon 已经默认实现了这些配置bean:

    • IClientConfig ribbonClientConfig: DefaultClientConfigImpl

    • IRule ribbonRule: ZoneAvoidanceRule

    • IPing ribbonPing: NoOpPing

    • ServerList ribbonServerList: ConfigurationBasedServerList

    • ServerListFilter ribbonServerListFilter: ZonePreferenceServerListFilter

    • ILoadBalancer ribbonLoadBalancer: ZoneAwareLoadBalancer

    二、准备工作

    这一篇文章基于上一篇文章的工程,启动eureka-server 工程;启动service-hi工程,它的端口为8762;将service-hi的配置文件的端口改为8763,并启动,这时你会发现:service-hi在eureka-server注册了2个实例,这就相当于一个小的集群。访问localhost:8761如图所示:

    如何一个工程启动多个实例,请看这篇文章:https://blog.csdn.net/forezp/article/details/76408139

    在这里插入图片描述

    三、建一个服务消费者

    重新新建一个spring-boot工程,取名为:service-ribbon;
    在它的pom.xml文件分别引入起步依赖spring-cloud-starter-eureka、spring-cloud-starter-ribbon、spring-boot-starter-web,代码如下:

    <?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>com.forezp</groupId>
    	<artifactId>service-ribbon</artifactId>
    	<version>0.0.1-SNAPSHOT</version>
    	<packaging>jar</packaging>
    
    	<name>service-ribbon</name>
    	<description>Demo project for Spring Boot</description>
    
    	<parent>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-starter-parent</artifactId>
    		<version>1.5.2.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>
    
    	<dependencies>
    		<dependency>
    			<groupId>org.springframework.cloud</groupId>
    			<artifactId>spring-cloud-starter-eureka</artifactId>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework.cloud</groupId>
    			<artifactId>spring-cloud-starter-ribbon</artifactId>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-web</artifactId>
    		</dependency>
    
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-test</artifactId>
    			<scope>test</scope>
    		</dependency>
    	</dependencies>
    
    	<dependencyManagement>
    		<dependencies>
    			<dependency>
    				<groupId>org.springframework.cloud</groupId>
    				<artifactId>spring-cloud-dependencies</artifactId>
    				<version>Dalston.RC1</version>
    				<type>pom</type>
    				<scope>import</scope>
    			</dependency>
    		</dependencies>
    	</dependencyManagement>
    
    	<build>
    		<plugins>
    			<plugin>
    				<groupId>org.springframework.boot</groupId>
    				<artifactId>spring-boot-maven-plugin</artifactId>
    			</plugin>
    		</plugins>
    	</build>
    
    	<repositories>
    		<repository>
    			<id>spring-milestones</id>
    			<name>Spring Milestones</name>
    			<url>https://repo.spring.io/milestone</url>
    			<snapshots>
    				<enabled>false</enabled>
    			</snapshots>
    		</repository>
    	</repositories>
    
    
    </project>
    
    
    

    在工程的配置文件指定服务的注册中心地址为http://localhost:8761/eureka/,程序名称为 service-ribbon,程序端口为8764。配置文件application.yml如下:

    eureka:
      client:
        serviceUrl:
          defaultZone: http://localhost:8761/eureka/
    server:
      port: 8764
    spring:
      application:
        name: service-ribbon
    

    在工程的启动类中,通过@EnableDiscoveryClient向服务中心注册;并且向程序的ioc注入一个bean: restTemplate;并通过@LoadBalanced注解表明这个restRemplate开启负载均衡的功能。

    @SpringBootApplication
    @EnableDiscoveryClient
    public class ServiceRibbonApplication {
    
    	public static void main(String[] args) {
    		SpringApplication.run(ServiceRibbonApplication.class, args);
    	}
    
    	@Bean
    	@LoadBalanced
    	RestTemplate restTemplate() {
    		return new RestTemplate();
    	}
    
    }
    
    

    写一个测试类HelloService,通过之前注入ioc容器的restTemplate来消费service-hi服务的“/hi”接口,在这里我们直接用的程序名替代了具体的url地址,在ribbon中它会根据服务名来选择具体的服务实例,根据服务实例在请求的时候会用具体的url替换掉服务名,代码如下:

    @Service
    public class HelloService {
    
        @Autowired
        RestTemplate restTemplate;
    
        public String hiService(String name) {
            return restTemplate.getForObject("http://SERVICE-HI/hi?name="+name,String.class);
        }
    
    }
    
    

    写一个controller,在controller中用调用HelloService 的方法,代码如下:

    
    /**
     * Created by fangzhipeng on 2017/4/6.
     */
    @RestController
    public class HelloControler {
    
        @Autowired
        HelloService helloService;
        @RequestMapping(value = "/hi")
        public String hi(@RequestParam String name){
            return helloService.hiService(name);
        }
    
    
    }
    
    

    在浏览器上多次访问http://localhost:8764/hi?name=forezp,浏览器交替显示:

    hi forezp,i am from port:8762

    hi forezp,i am from port:8763

    这说明当我们通过调用restTemplate.getForObject(“http://SERVICE-HI/hi?name=”+name,String.class)方法时,已经做了负载均衡,访问了不同的端口的服务实例。

    四、此时的架构

    在这里插入图片描述

    • 一个服务注册中心,eureka server,端口为8761
    • service-hi工程跑了两个实例,端口分别为8762,8763,分别向服务注册中心注册
    • sercvice-ribbon端口为8764,向服务注册中心注册
    • 当sercvice-ribbon通过restTemplate调用service-hi的hi接口时,因为用ribbon进行了负载均衡,会轮流的调用service-hi:8762和8763 两个端口的hi接口;

    源码下载:https://github.com/forezp/SpringCloudLearning/tree/master/chapter2

    更多阅读

    史上最简单的 SpringCloud 教程汇总

    SpringBoot教程汇总

    Java面试题系列汇总

    五、参考资料

    本文参考了以下:

    spring-cloud-ribbon

    springcloud ribbon with eureka

    服务消费者

    SouthEast
    扫码关注公众号有惊喜

    (转载本站文章请注明作者和出处 方志朋的博客

    展开全文
  • 简单理解REST

    万次阅读 2018-12-12 13:55:41
    REST由Roy Fielding于2000年在他的博士论文中引入和定义。REST是用于设计分布式系统的架构风格。它不是标准,而是一组约束,例如无状态,具有客户端/服务器关系和统一接口。REST与HTTP并不严格相关,但最常与它相...
  • REST,以及RESTful的讲解

    万次阅读 多人点赞 2018-04-21 18:59:08
    1.传统下的API接口  http是目前在互联网上... ...  如果说你要删除一个数据,以往的做法通常是 delete/{id}   如果你要更新一个数据,可能是Post数据放Body,然后方法是 update/{id}, 或者是artichle/{id}?meth...
  • Django REST 框架

    千人学习 2019-08-07 15:57:44
    在RESTful编程风格流行的今天,Django也有一个非常好用的Rest框架,它就是Django REST framework,本课程首先,介绍了什么是api,又介绍了什么是RESTful,最好对Django REST框架做了详细讲解。
  • RestHttp

    千次阅读 2016-09-22 14:11:02
    RestHttp
  • rest 参数

    2018-01-21 22:00:42
    rest 参数 ES6 引入 rest 参数(形式为...变量名),用于获取函数的多余参数,这样就不需要使用arguments对象了。rest 参数搭配的变量是一个数组,该变量将多余的参数放入数组中。 function add(...values) { ...
  • REST简介

    千次阅读 2016-09-11 22:45:47
    一说到REST,我想大家的第一反应就是“啊,就是那种前后台通信方式。”但是在要求详细讲述它所提出的各个约束,以及如何开始搭建REST服务时,却很少有人能够清晰地说出它到底是什么,需要遵守什么样的准则。  在...
  • 转载请标明出处: http://blog.csdn.net/forezp/article/details/69788938 本文出自方志朋的博客 在上一篇文章,讲了服务的注册和发现...Spring cloud有两种服务调用方式,一种是ribbon+restTemplate,另一种...
  • RESTREST是什么

    千次阅读 2020-01-18 16:12:36
    REST 自从Roy Fielding博士在2000年他的博士论文中提出REST(Representational State Transfer)风格的软件架构模式后,REST就基本上迅速取代了复杂而笨重的SOAP,成为Web API的标准了。 什么是Web API呢? 如果我们...
  • Rest接口简介

    万次阅读 2018-11-16 09:53:30
    REST 用来规范应用如何在 HTTP 层与 API 提供方进行数据交互 。REST 描述了 HTTP 层里客户端和服务器端的数据交互规则;客户端通过向服务器端发送 HTTP(s)请求,接收服务器的响应,完成一次 HTTP 交互。这个交互...
  • REST规范

    千次阅读 2019-07-04 19:20:53
    1、REST与技术无关,代表的是一种软件架构风格,REST是Representaion State Transfer的简称,中文翻译为‘表征状态转移’ 2、REST从资源的角度审视整个网络,他将分布在网络中的某个节点的资源通过URL进行标识,...
  • Django REST framework JWT认证

    万次阅读 2018-12-05 16:25:56
    关于签发和校验JWT,我们可以使用Django REST framework JWT扩展来完成. 1.安装 pip install djangorestframework-jwt 2.配置 REST_FRAMEWORK = {  # 认证  'DEFAULT_AUTHENTICATION_CLASSES': (  'rest_...
  • 运行Gazebo出现[Err] [REST.cc:205] Error in REST request的解决办法
  • rest参数

    2018-12-09 21:33:18
    ES6引入了rest参数(形式"…变量名"),用于获取函数的多余参数,这样就不需要使用arguments对象。rest参数搭配的变量是一个数组,该变量将多余的参数放入其中。 function add(...value){ let sum=0; for...
  • Rest架构

    2018-11-08 07:08:39
    这个时候,Rest这个名词一直在出现,我觉得我应该理解下它,这是一种软件架构风格。它是一种针对网络应用的设计和开发方式。可以降低开发的复杂性,提高系统的可伸缩性。 它的轻量级web服务,发挥HTTP协议的原生的...
  • REST示例

    千次阅读 2018-08-26 08:33:29
    REST示例  我想,很多读者可能并不太清楚REST到底是一个什么概念。那么,首先让我们来看一个简单的基于HTTP的REST服务示例。  假设用户正在访问一个电子商务网站www.egoods.com。该网站对其所销售的各个物品进行...
  • WebService(四):REST

    2018-07-10 15:55:04
    REST
  • Rest-Assured 是一个测试 Restful Web Service 的 Java 类库,我们能够测试各种各样的请求组合,依次测试核心业务逻辑的不同组合。Rest-Assured 库提供了验证从服器收到的 HTTP 响应的功能。我们可以很方便验证状态...
  • Rest参数与Spread操作符

    万次阅读 2019-05-11 15:07:11
    Rest参数(剩余参数)…: 在 JavaScript 中,很多内建函数都支持传入任意个参数。 例如: Math.max(arg1, arg2, …, argN) —— 返回入参中的最大值。 Object.assign(dest, src1, …, srcN) —— 依次合并 src1…N...
  • rest教程

    千次阅读 2018-01-23 14:21:20
    rest 目录(?)[+] REST就是一种架构思想,目的是建立长期的,不会随着技术发展被快速淘汰的Web服务架构,6个特征: 客户端服务器各司所职,服务器不存储状态,客户端可以使用缓存,接口...
  • RESTREST风格的web服务

    千次阅读 2018-01-03 19:49:52
    1.前言:REST是由Roy Fielding提出的一种软件架构,现如今也是因为REST模式的web服务与复杂的SOAP、XML-RPC对比来说, 更加简洁,越来越多的web服务开始采用REST风格设计和实现。 简单的说REST就是URL定位资源,...
  • 本内容主要是介绍使用Java语言,...本篇主要来了解下什么是REST或者RESTFUL,然后了解框架RestAssured是什么,能做些什么。 1.REST或者RESTFUL REST是一种软件架构风格,其实就是这么一个特点就行。全称是Rep...
  • REST in Action 《REST 实战》

    千次阅读 2015-03-03 15:57:01
    基于 Jersey 的 REST 实战。最近在做 Java RESTful 相关的项目,发现网上中文的资料比较少,而且 Jersey 的更新比较快,利用业余时间写了本书,图文并茂,用大量实例带你一步一步走进 REST 的世界,最终构建一个完整...
  • rest api是什么 在此博客中,我将讨论REST API,什么是Rest API,什么是REST API以及如何使用。 因此,希望您阅读此博客后能对REST API有所了解。 Roy Fielding定义了REST。 在2000年的博士学位论文中,他介绍了...

空空如也

1 2 3 4 5 ... 20
收藏数 162,842
精华内容 65,136
关键字:

rest