`
lobin
  • 浏览: 430843 次
  • 性别: 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开发者。作者李卫民整理了开源项目,并提供了完整的在线文档、源码和视频教程,方便读者全面学习。书中首先介绍了...

    C++中的微服务架构实现:深入解析与实践

    在现代软件架构中,微服务架构已成为构建可扩展、灵活且易于维护系统的关键方法。C++,作为一种高性能的编程语言,其在微服务架构中的应用也日益受到关注。本文将详细介绍C++中微服务架构的实现,包括核心概念、关键...

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

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

    从业务架构到微服务

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

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

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

    微服务Spring Cloud 程序前后端代码代码示例

    在IT行业中,微服务架构和Spring Cloud是两个关键的概念,它们在现代企业级应用程序开发中占据了重要的地位。本文将深入探讨这两个技术,并结合提供的“微服务Spring Cloud程序前后端代码代码示例”,来阐述如何利用...

    微服务技术架构设计图.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开始学微服务

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

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

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

    04.2、微服务—SpringCloud(20题)1

    微服务是一种架构风格,它强调将大型复杂软件应用分解为多个小型、独立的、可自我管理的服务,每个服务都专注于完成一个特定的业务功能。这种架构设计理念源自于UNIX哲学,强调单一职责原则,使得服务之间松耦合,...

Global site tag (gtag.js) - Google Analytics