`
lobin
  • 浏览: 425970 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论
阅读更多

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

0
0
分享到:
评论

相关推荐

    经典Java微服务架构教程 微服务从开发到部署.pdf

    【Java微服务架构教程】本书深入探讨了Java微服务架构的开发和部署,适用于希望掌握微服务技术的Java开发者。作者李卫民整理了开源项目,并提供了完整的在线文档、源码和视频教程,方便读者全面学习。书中首先介绍了...

    微服务介绍/微服务架构方案PPT

    ### 微服务架构方案知识点详解 #### 一、微服务架构概述 - **定义**: 微服务架构是一种设计思想,将应用程序分解为一组小型、独立的服务,这些服务围绕着特定的业务功能构建,并且能够独立部署、扩展和维护。每个...

    从业务架构到微服务

    ### 从业务架构到微服务:深度解析与实践探索 #### 微服务的起源与定义 微服务架构是一种设计思路,旨在将一个大型的应用分解成一系列小型、独立的服务,每个服务都围绕着特定的业务能力构建,并且可以独立地部署...

    SpringCloud微服务接口这么多怎么调试

    本文来自程序猿,本文主要介绍了SpringCloud微服务下服务接口调试及管理,什么样方式可以让微服务的接口管理变得更加容易些,希望对您的学习有所帮助。我们知道在微服务架构下,软件系统会被拆分成很多个独立运行的...

    微服务架构设计.doc

    微服务架构设计是一种将单一应用程序分解为一组小型、独立的服务的方法,每个服务都在自己的进程中运行,专注于完成特定的业务功能。这种设计模式旨在提高系统的可伸缩性、可维护性和可部署性。以下是对微服务架构...

    微服务技术架构设计图.pptx

    微服务技术架构设计是现代软件开发领域中的一个重要话题,它旨在通过将大型的单体应用分解为一组小型、独立的服务,以提高系统的可扩展性、可维护性和敏捷性。在"微服务技术架构设计图.pptx"中,我们可以看到多种...

    微服务学习微服务学习微服务学习微服务学习1

    在这个微服务学习资料包中,我们主要关注的是Java平台上的实现,特别是阿里巴巴的微服务解决方案。 首先,"00 微服务架构介绍.pdf"可能包含了微服务架构的基本概念和优势。它可能会涵盖为什么从单体应用转向微服务...

    GoldenGate微服务的安装和配置.docx

    GoldenGate 微服务安装和配置指南 GoldenGate 微服务安装和配置是 Oracle GoldenGate(OGG)最新版本的安装和使用教程,本文将详细介绍 GoldenGate 19.1 微服务的安装和配置过程,附带详细的图文介绍,帮助读者快速...

    微服务请求日志统一处理方案

    在微服务架构中,日志的统一管理与处理是一个重要的课题。这有助于提高系统的可维护性,便于故障排查和性能优化。"微服务请求日志统一处理方案"旨在解决这个问题,通过创建一个独立的日志组件,实现对各个微服务请求...

    书籍-微服务:从设计到部署_微服务_微服务马丁_

    《微服务:从设计到部署》是一本由马丁·福勒(Martin Fowler)撰写的专业书籍,专注于介绍微服务架构的设计与实施。这本书是微服务领域的经典之作,特别适合那些希望了解和入门微服务的读者。 微服务是一种软件...

    天机学堂微服务项目2023 天机学堂微服务项目2023天机学堂微服务项目2023

    《天机学堂微服务项目2023:深入探索微服务架构与实践》 微服务作为现代软件开发的重要模式,已经逐渐成为企业级应用构建的标准。天机学堂,作为一个专注于技术教育的平台,推出了2023年的微服务项目,旨在帮助学员...

    微服务架构治理 - 架构腐化之谜-Thoughtworks

    微服务架构治理 - 架构腐化之谜-Thoughtworks 微服务架构治理是指在微服务架构中,通过合理的设计、实施和管理来确保架构的健康度和可维护性。本文将讨论微服务架构治理的重要性、架构腐化的原因、保持架构健康度的...

    微服务架构设计方案.pdf

    微服务架构是一种现代软件开发的方法论,旨在将大型复杂应用程序分解为一组小型、独立的、可部署的服务,每个服务专注于特定的业务功能。这一概念在近年来互联网行业中得到了广泛应用,因为它促进了敏捷开发、可伸缩...

    从0开始学微服务

    微服务是一种架构设计模式,它将单一应用程序分解为一组小型、独立的服务,每个服务都运行在其自己的进程中,并且可以独立部署。这种模式在现代软件开发中广泛应用,特别是对于大型复杂应用,因为它能提高开发效率、...

    微服务拆分的理论和原则及案例详细说明

    微服务是一种现代软件架构风格,它提倡将大型的单体应用程序分解为一组小型、独立的服务,每个服务都专注于单一业务功能,并且能够独立部署。这种架构模式源自于企业对快速响应市场变化、提高开发效率和可扩展性的...

    美团点评微服务架构实践

    美团点评微服务架构实践的过程展示了微服务架构从理念到实践的过程,从传统单体架构到分布式微服务架构的演进,其中不仅涉及技术选型、服务拆分、治理策略、弹性伸缩等技术问题,还涉及组织结构、技术文化等非技术...

    微服务精选:用户中心微服务设计理念.pdf

    微服务精选:用户中心微服务设计理念 用户中心设计理念是微服务架构中的一个重要组件,它负责管理用户的身份验证、授权和会话管理。在本文档中,我们将详细介绍用户中心设计理念的发展史、用户中心的令牌、多种场景...

Global site tag (gtag.js) - Google Analytics