Ribbon是微服务的一个核心基础组件,提供多协议HTTP、TCP以及UDP的服务调用RPC功能以及负载均衡功能。
Ribbon:一个客户端IPC(Inter Process Communication)库,RPC(Remote Procedure Calls)库。支持负载均衡、故障容错、多协议支持:HTTP, TCP, UDP,支持异步(asynchronous)以及reactive模型、Caching 以及batching。
Ribbon 注解方式
举例某个api应用,运行了两个实例(部署了2台机器),这个应用提供了两个api:
1、/test
2、/test/{version}
这两个api都有个参数data,/test/{version}还有个@PathVariable的version参数。
/test定义如下:
@ResponseBody @RequestMapping(value = "test") public String test(@RequestParam String data) { return data; }
/test/{version}定义如下:
@ResponseBody @RequestMapping(value = "test/{version}") public String testvn(@PathVariable String version, @RequestParam String data) { return data + ";version=" + version; }
就是两个普通的api,和我们以前写的api是一样的,可以直接请求:
http://localhost:8081/test?data=aaa
http://localhost:8082/test?data=aaa
http://localhost:8081/test/1.0?data=aaa
http://localhost:8082/test/1.0?data=aaa
通过ribbon调用这俩个api服务:
注解方式:
public interface TestService { @Http( method = Http.HttpMethod.GET, uri = "/test?data={data}" ) RibbonRequest<ByteBuf> test(@Var("data") String data); @Http( method = Http.HttpMethod.GET, uri = "/test/{version}?data={data}" ) RibbonRequest<ByteBuf> testvn(@Var("version") String version, @Var("data") String data); }
通过ribbon调用/test服务:
@Test public void test11() { ConfigurationManager.getConfigInstance().setProperty("TestService.ribbon." + CommonClientConfigKey.MaxAutoRetriesNextServer, "3"); ConfigurationManager.getConfigInstance().setProperty("TestService.ribbon." + CommonClientConfigKey.ListOfServers, "localhost:8082,localhost:8081"); TestService testService = Ribbon.from(TestService.class); RibbonRequest<ByteBuf> request = testService.test("aaa"); ByteBuf result0 = request.execute(); ByteBuffer buf = result0.nioBuffer(); byte[] bytes = new byte[buf.remaining()]; buf.get(bytes); System.out.println(new String(bytes)); }
通过ribbon调用/test/{version}服务:
@Test public void test21() { ConfigurationManager.getConfigInstance().setProperty("TestService.ribbon." + CommonClientConfigKey.MaxAutoRetriesNextServer, "3"); ConfigurationManager.getConfigInstance().setProperty("TestService.ribbon." + CommonClientConfigKey.ListOfServers, "localhost:8082,localhost:8081"); TestService testService = Ribbon.from(TestService.class); RibbonRequest<ByteBuf> request = testService.testvn("1.0", "aaa"); ByteBuf result0 = request.execute(); ByteBuffer buf = result0.nioBuffer(); byte[] bytes = new byte[buf.remaining()]; buf.get(bytes); System.out.println(new String(bytes)); }
Case: Instant messaging communication over XMPP base TCP
----------------------------------------------------------------
Little thinking of interpreting XML document using automata
Little thinking of interpreting XML document using automata
- Attachment are just to attempt to interpret a simple document element like:
<e from='je@localhost.com' to='localhost.com' version='1.0' xml:lang='en' xmlns='jx:clc' xmlns:e='http://ex.jx.org/e'>
the element is not a completed XML document element util.
-----------------------------------------------------------------------
Ribbon:一个客户端IPC(Inter Process Communication)库,RPC(Remote Procedure Calls)库。支持负载均衡、故障容错、多协议支持:HTTP, TCP, UDP,支持异步(asynchronous)以及reactive模型、Caching 以及batching。
Ribbon和Eureka配合用于发现查找注册的服务。Ribbon根据查找到的服务列表负责将请求路由转发到后端的服务(负载均衡)。
Eureka是一个微服务注册中心(registry),服务通过将自己注册在registry以便于服务进行发现定位查找。
HTTP请求,Template方式:
http://localhost:8081/test?data=aaa
@Test public void test1() { HttpResourceGroup httpResourceGroup = Ribbon.createHttpResourceGroup("movieServiceClient", ClientOptions.create() .withMaxAutoRetriesNextServer(3) .withConfigurationBasedServerList("localhost:8082,localhost:8081")); HttpRequestTemplate<ByteBuf> recommendationsByUserIdTemplate = httpResourceGroup.newTemplateBuilder("recommendationsByUserId", ByteBuf.class) .withMethod("GET") .withUriTemplate("/test?data=aaa") // .withFallbackProvider(new RecommendationServiceFallbackHandler()) // .withResponseValidator(new RecommendationServiceResponseValidator()) .build(); RibbonRequest<ByteBuf> request = recommendationsByUserIdTemplate.requestBuilder() .build(); // Observable<ByteBuf> result = request.observe(); ByteBuf result0 = request.execute(); ByteBuffer buf = result0.nioBuffer(); byte[] bytes = new byte[buf.remaining()]; buf.get(bytes); System.out.println(new String(bytes)); }
http://localhost:8082/test/1.0?data=aaa
@Test public void test2() { HttpResourceGroup httpResourceGroup = Ribbon.createHttpResourceGroup("movieServiceClient", ClientOptions.create() .withMaxAutoRetriesNextServer(3) .withConfigurationBasedServerList("localhost:8082,localhost:8081")); HttpRequestTemplate<ByteBuf> recommendationsByUserIdTemplate = httpResourceGroup.newTemplateBuilder("recommendationsByUserId", ByteBuf.class) .withMethod("GET") .withUriTemplate("/test/{version}?data=aaa") // .withFallbackProvider(new RecommendationServiceFallbackHandler()) // .withResponseValidator(new RecommendationServiceResponseValidator()) .build(); RibbonRequest<ByteBuf> request = recommendationsByUserIdTemplate.requestBuilder() .withRequestProperty("version", "1.0") .build(); // Observable<ByteBuf> result = request.observe(); ByteBuf result0 = request.execute(); ByteBuffer buf = result0.nioBuffer(); byte[] bytes = new byte[buf.remaining()]; buf.get(bytes); System.out.println(new String(bytes)); }
注解方式:
public interface TestService { @Http( method = Http.HttpMethod.GET, uri = "/test?data={data}" ) RibbonRequest<ByteBuf> test(@Var("data") String data); @Http( method = Http.HttpMethod.GET, uri = "/test/{version}?data={data}" ) RibbonRequest<ByteBuf> testvn(@Var("version") String version, @Var("data") String data); }
@Test public void test11() { ConfigurationManager.getConfigInstance().setProperty("TestService.ribbon." + CommonClientConfigKey.MaxAutoRetriesNextServer, "3"); ConfigurationManager.getConfigInstance().setProperty("TestService.ribbon." + CommonClientConfigKey.ListOfServers, "localhost:8082,localhost:8081"); TestService testService = Ribbon.from(TestService.class); RibbonRequest<ByteBuf> request = testService.test("aaa"); ByteBuf result0 = request.execute(); ByteBuffer buf = result0.nioBuffer(); byte[] bytes = new byte[buf.remaining()]; buf.get(bytes); System.out.println(new String(bytes)); }
@Test public void test21() { ConfigurationManager.getConfigInstance().setProperty("TestService.ribbon." + CommonClientConfigKey.MaxAutoRetriesNextServer, "3"); ConfigurationManager.getConfigInstance().setProperty("TestService.ribbon." + CommonClientConfigKey.ListOfServers, "localhost:8082,localhost:8081"); TestService testService = Ribbon.from(TestService.class); RibbonRequest<ByteBuf> request = testService.testvn("1.0", "aaa"); ByteBuf result0 = request.execute(); ByteBuffer buf = result0.nioBuffer(); byte[] bytes = new byte[buf.remaining()]; buf.get(bytes); System.out.println(new String(bytes)); }
负载均衡
class URLConnectionLoadBalancer { private final ILoadBalancer loadBalancer; // retry handler that does not retry on same server, but on a different server private final RetryHandler retryHandler = new DefaultLoadBalancerRetryHandler(0, 1, true); public URLConnectionLoadBalancer(List<Server> serverList) { loadBalancer = LoadBalancerBuilder.newBuilder().buildFixedServerListLoadBalancer(serverList); } public String call(final String path) throws Exception { return LoadBalancerCommand.<String>builder() .withLoadBalancer(loadBalancer) .build() .submit(new ServerOperation<String>() { @Override public Observable<String> call(Server server) { URL url; try { url = new URL("http://" + server.getHost() + ":" + server.getPort() + path); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); InputStream is = conn.getInputStream(); ByteArrayOutputStream os = new ByteArrayOutputStream(); byte[] bytes = new byte[1024]; int nbytes = -1; while ((nbytes = is.read(bytes)) > 0) { os.write(bytes, 0, nbytes); } String content = new String(bytes); content = content.trim(); // content = conn.getResponseMessage(); return Observable.just(content); } catch (Exception e) { return Observable.error(e); } } }).toBlocking().first(); } public LoadBalancerStats getLoadBalancerStats() { return ((BaseLoadBalancer) loadBalancer).getLoadBalancerStats(); } }
@Test public void test() { URLConnectionLoadBalancer urlLoadBalancer = new URLConnectionLoadBalancer(Lists.newArrayList( new Server("localhost", 8081), new Server("localhost", 8082))); for (int i = 0; i < 6; i++) { try { System.out.println(urlLoadBalancer.call("/test?data=aaa")); } catch (Exception e) { e.printStackTrace(); } } System.out.println("=== Load balancer stats ==="); System.out.println(urlLoadBalancer.getLoadBalancerStats()); }
1、https://github.com/Netflix/eureka
Ribbon还提供了一个template方式来请求HTTP资源,Template方式可参考文章: https://lobin.iteye.com/blog/1576159。
Ribbon负载均衡例子参考文章: https://lobin.iteye.com/blog/1576159。
1、https://github.com/Netflix/ribbon
相关推荐
【Java微服务架构教程】本书深入探讨了Java微服务架构的开发和部署,适用于希望掌握微服务技术的Java开发者。作者李卫民整理了开源项目,并提供了完整的在线文档、源码和视频教程,方便读者全面学习。书中首先介绍了...
### 微服务架构方案知识点详解 #### 一、微服务架构概述 - **定义**: 微服务架构是一种设计思想,将应用程序分解为一组小型、独立的服务,这些服务围绕着特定的业务功能构建,并且能够独立部署、扩展和维护。每个...
### 从业务架构到微服务:深度解析与实践探索 #### 微服务的起源与定义 微服务架构是一种设计思路,旨在将一个大型的应用分解成一系列小型、独立的服务,每个服务都围绕着特定的业务能力构建,并且可以独立地部署...
本文来自程序猿,本文主要介绍了SpringCloud微服务下服务接口调试及管理,什么样方式可以让微服务的接口管理变得更加容易些,希望对您的学习有所帮助。我们知道在微服务架构下,软件系统会被拆分成很多个独立运行的...
微服务架构设计是一种将单一应用程序分解为一组小型、独立的服务的方法,每个服务都在自己的进程中运行,专注于完成特定的业务功能。这种设计模式旨在提高系统的可伸缩性、可维护性和可部署性。以下是对微服务架构...
微服务技术架构设计是现代软件开发领域中的一个重要话题,它旨在通过将大型的单体应用分解为一组小型、独立的服务,以提高系统的可扩展性、可维护性和敏捷性。在"微服务技术架构设计图.pptx"中,我们可以看到多种...
在这个微服务学习资料包中,我们主要关注的是Java平台上的实现,特别是阿里巴巴的微服务解决方案。 首先,"00 微服务架构介绍.pdf"可能包含了微服务架构的基本概念和优势。它可能会涵盖为什么从单体应用转向微服务...
GoldenGate 微服务安装和配置指南 GoldenGate 微服务安装和配置是 Oracle GoldenGate(OGG)最新版本的安装和使用教程,本文将详细介绍 GoldenGate 19.1 微服务的安装和配置过程,附带详细的图文介绍,帮助读者快速...
在微服务架构中,日志的统一管理与处理是一个重要的课题。这有助于提高系统的可维护性,便于故障排查和性能优化。"微服务请求日志统一处理方案"旨在解决这个问题,通过创建一个独立的日志组件,实现对各个微服务请求...
《微服务:从设计到部署》是一本由马丁·福勒(Martin Fowler)撰写的专业书籍,专注于介绍微服务架构的设计与实施。这本书是微服务领域的经典之作,特别适合那些希望了解和入门微服务的读者。 微服务是一种软件...
《天机学堂微服务项目2023:深入探索微服务架构与实践》 微服务作为现代软件开发的重要模式,已经逐渐成为企业级应用构建的标准。天机学堂,作为一个专注于技术教育的平台,推出了2023年的微服务项目,旨在帮助学员...
微服务架构治理 - 架构腐化之谜-Thoughtworks 微服务架构治理是指在微服务架构中,通过合理的设计、实施和管理来确保架构的健康度和可维护性。本文将讨论微服务架构治理的重要性、架构腐化的原因、保持架构健康度的...
微服务架构是一种现代软件开发的方法论,旨在将大型复杂应用程序分解为一组小型、独立的、可部署的服务,每个服务专注于特定的业务功能。这一概念在近年来互联网行业中得到了广泛应用,因为它促进了敏捷开发、可伸缩...
微服务是一种架构设计模式,它将单一应用程序分解为一组小型、独立的服务,每个服务都运行在其自己的进程中,并且可以独立部署。这种模式在现代软件开发中广泛应用,特别是对于大型复杂应用,因为它能提高开发效率、...
微服务是一种现代软件架构风格,它提倡将大型的单体应用程序分解为一组小型、独立的服务,每个服务都专注于单一业务功能,并且能够独立部署。这种架构模式源自于企业对快速响应市场变化、提高开发效率和可扩展性的...
微服务精选:用户中心微服务设计理念 用户中心设计理念是微服务架构中的一个重要组件,它负责管理用户的身份验证、授权和会话管理。在本文档中,我们将详细介绍用户中心设计理念的发展史、用户中心的令牌、多种场景...
微服务是一种架构风格,它强调将大型复杂软件应用分解为多个小型、独立的、可自我管理的服务,每个服务都专注于完成一个特定的业务功能。这种架构设计理念源自于UNIX哲学,强调单一职责原则,使得服务之间松耦合,...