精华内容
下载资源
问答
  • spring cloud整合dubbo组件实现服务调用,以及dubbo调用服务和springcloud的feign调用服务的区别

             之前看到很多人说Dubbo和SpringCloud怎么选,其实Spring Cloud与Dubbo的比较本身是不公平的,主要前者是一套较为完整的架构方案,而Dubbo只是其中的服务治理的解决方案。

    注:

    1. springcloud是微服务架构的一整套技术解决方案的技术栈,是这些技术栈的框架集合,包含了服务治理、注册中心、配置中心、客户端负载均衡、网关、限流熔断、分布式链路追踪、分布式事务等技术栈,而Dubbo只是处理服务治理的解决方案的框架
    2. 同 Spring Cloud 一样,Spring Cloud Alibaba 也是一套微服务解决方案,包含开发分布式应用微服务的必需组件
    3. 在Spring Cloud Alibaba的整合之下,Dubbo用户既可以享受到原本RPC带来性能优势,又可以更好的享受Spring Cloud的各种福利;而对于Spring Cloud用户来说,在服务治理层面,又对了一个不错的可选项。可以说这块的整合是真正的让这两大用户群体得到了很好的融合,起到了互相成就的作用。不用再同时顾虑Eureka和Zookeeper的配置,只需要关注和维护好Nacos一个即可

            SpringCloud里面服务治理的解决方案是:Eureke或Nacos注册中心+ Feign或Ribbon进行调用服务调用,自从spring cloud alibab框架从springcloud孵化后,dubbo也可以是SpringCloud中另一种服务治理的解决方案:即Nacos+Dubbo实现服务调用,各有优劣,要根据不同情况使用。


            为什么用dubbo?spring cloud怎么整合dubbo?在微服务中实现远程服务调用,一般是用Feign基于HTTP协议调用远程服务,也有用dubbo基于RPC协议进行远程服务调用。

    比较项 Feign(RESTful) Dubbo
    通讯协议 HTTP 默认Dubbo协议
    性能 略低 较高
    灵活度

    注:

    1. RESTful是基于HTTP协议进行交互的,HTTP协议包含大量的请求头、响应头信息。而dubbo是基于dubbo自定义的二进制协议进行传输,消息体比较简单,传输数据要小很多
    2. dubbo默认采用dubbo协议,dubbo协议采用单一长连接和NIO异步通讯,适合于小数据量大并发的服务调用,不适合传送大数据量的服务,比如传文件,传视频等,除非请求量很低
    3. dubbo好比方言,RESTful好比普通话。方言在局部地区交流更快,普通话更容易在大部分地区交流

    微服务里面既可以使用Feign、也可以使用Dubbo进行远程调用,可根据情况使用不同的远程调用
    在这里插入图片描述

    DEMO

    一、创建生产者的api的jar

    在jar里面提供接口,生产者和消费者都引入这个jar
    在这里插入图片描述

    二、生产者

    1)引入依赖

            <!-- dubbo -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-dubbo</artifactId>
            </dependency>
    
            <!-- 引入dubbo服务提供者的api -->
            <dependency>
                <groupId>com.xinlin.springcloud.demo</groupId>
                <artifactId>products-api</artifactId>
                <version>0.0.1-SNAPSHOT</version>
            </dependency>
    

    2)配置文件修改

    server:
      port: 9002
    
    spring:
      application:
        name: products-service
      datasource:
            url: jdbc:mysql://127.0.01:3306/test?useSSL=true
            username: admin
            password: admin-123
      cloud:
        nacos:
          discovery:
            server-addr: localhost:8848
    dubbo:
      scan:
        base-packages: com.xinlin.demo.products.service #dubbo扫描的包目录
      protocol:
        name: dubbo   #dubbo协议
        port: 20880   #端口
      registry:
        address: nacos://localhost:8848 #dubbo注册中心的地址
        # spring-cloud://localhost #用spring cloud的注册中心
    

    注:
    dubbo.protocol.name 默认使用dubbo协议,也可以使用其他协议,例如http协议
    dubbo.protocol.port = -1 表示从20880开始,如果被占用则端口号加1

    3)服务端创建dubbo服务

    package com.xinlin.demo.products.service.impl;
    
    import com.xinlin.demo.products.service.DubboService;
    import org.apache.dubbo.config.annotation.Service;
    
    
    @Service
    public class DubboServiceImpl implements DubboService {
    
        @Override
        public String findUserInfo(Integer id) {
            String info = String.format("dubbo服务查询的用户信息:用户id=[%s]",id);
            return info;
        }
    }
    

    注:这里的@Service是Dubbo的注解,表示dubbo服务

    三、消费者

    1)消费者端引入依赖,同生产者的pom一样
    2)配置文件修改

    dubbo:
      application:
        name: comsumer-service
      scan:
        base-packages: com.xinlin.demo.comsumer
      registry:
        address: nacos://127.0.0.1:8848
    

    注:可以和生产者一样,只要端口号不一样即可,但是消费者没有提供服务的话,可以不指定dubbo协议和端口

    3)消费者注入dubbo

        @Autowired
        private PorductService porductService;
    
        //Reference为dubbo的注解
        @Reference(timeout = 18000,check = false)
        private DubboService dubboService;
    
        @RequestMapping(value = "/findUser/{id}")
        public String findUser(@PathVariable("id") Integer id){
            //调用dubbo服务,获取用户信息
            String info = dubboService.findUserInfo(id);
            return info;
        }
    

    四、测试验证

    1)先启动nacos的注册中心,再分别启动生产者、消费者的服务
    2)可以看到消费者成功调用了生产者的dubbo服务
    在这里插入图片描述

    注:nacos的注册中心的启动参考这篇:spring cloud 使用nacos作为注册中心

    五、启动异常问题

          引入spring-cloud-starter-dubbo后启动项目失败:java.lang.IllegalStateException: No application config found or it’s not a valid config! Please add <dubbo:application name="…" /> to your spring config,检查源码是说dubbo.application.name这个配置没有,但是我配置了也是提示这个异常,再检查发现是jar版本问题

    我这个问题的解决方案:
    spring-cloud-alibaba-dependencies由2.1.0.RELEASE修改为2.1.1.RELEASE即可解决
    具体原因:引入spring-cloud-starter-dubbo后启动项目失败

    展开全文
  • SpringCloud-----SpringCloud调用服务时出现重复调用
    展开全文
  • 使用Spring Boot发布服务和调用服务

    千次阅读 2018-03-10 13:29:06
    发布服务,简单的使用一个RequsetMapping注解发布:如下:@RequestMapping("/LocalUploadCustomerServer"...}调用服务1、如果要把本地数据发往接口方,则使用Post RestTemplate restTemplate =...

    发布服务,简单的使用一个RequsetMapping注解发布:

    如下:

    @RequestMapping("/LocalUploadCustomerServer")
    public void LocalUploadCustomerServer() throws Exception {
        
    }

    调用服务

    1、如果要把本地数据发往接口方,则使用Post

     RestTemplate restTemplate = new RestTemplate();
    restTemplate.postForObject(url,Json,String.class);

    2、在服务端接收参数(一定要在参数前写@RequestBody 不然接收不到,困扰了好久)

    @RequestMapping(value = "/LocalUploadEmployeeServer", produces = "text/html;charset=UTF-8")
        public void localUploadEmployeeServer(@RequestBody String json) {
            employeeService.updateEmployeeCloud(json);
        }

    3、乱码问题

        可以设置个头信息,这样可以防止数据传输乱码

         HttpHeaders headers = new HttpHeaders();
        headers.set("Accept-Charset", "utf-8");
        headers.set("Content-type", "application/json; charset=utf-8");  //header的规定
        HttpEntity<String> formEntity = new HttpEntity<String>(json, headers);
        restTemplate.postForObject(url,formEntity,String.class);

    4、RestTemplate 请求方式详解

    delete() 在特定的URL上对资源执行HTTP DELETE操作

     

    exchange() URL上执行特定的HTTP方法,返回包含对象的ResponseEntity,这个对象是从响应体中 映射得到的

     

    execute() URL上执行特定的HTTP方法,返回一个从响应体映射得到的对象

     

    getForEntity() 发送一个HTTP GET请求,返回的ResponseEntity包含了响应体所映射成的对象

     

    getForObject() 发送一个HTTP GET请求,返回的请求体将映射为一个对象

     

    postForEntity() POST 数据到一个URL,返回包含一个对象的ResponseEntity,这个对象是从响应体中映射得 到的

     

    postForObject() POST 数据到一个URL,返回根据响应体匹配形成的对象

     

    headForHeaders() 发送HTTP HEAD请求,返回包含特定资源URLHTTP

     

    optionsForAllow() 发送HTTP OPTIONS请求,返回对特定URLAllow头信息

     

    postForLocation() POST 数据到一个URL,返回新创建资源的URL

     

    put() PUT 资源到特定的URL

    例子

    1、本地向服务器发送数据

    @RequestMapping("/LocalUploadCustomerServer")
    public void LocalUploadCustomerServer() throws Exception {
        List<Customer> list=cs.selectAllCustomer();
    
        RestTemplate restTemplate = new RestTemplate();
        String json=JSONArray.fromObject(list).toString();
        //服务器IP地址
        String url="http://"+ip+"/LocalUploadCustomerServer";
        //处理中文乱码
        HttpHeaders headers = new HttpHeaders();
        headers.set("Accept-Charset", "utf-8");
        headers.set("Content-type", "application/json; charset=utf-8");  //header的规定
        HttpEntity<String> formEntity = new HttpEntity<String>(json, headers);
        restTemplate.postForObject(url,formEntity,String.class);
    }


    2、本地调用向服务器接收数据(因为都是本地调用的)
        @RequestMapping("/ServerDownloadFacheLocal")
        public void ServerDownloadFacheLocal() throws IOException {
             RestTemplate restTemplate = new RestTemplate();
             List<Fache> fachesList= restTemplate.postForObject("http://"+ip+"/ServerDownloadFacheLocal",List.class,List.class);
             facheService.updateFacheCould(fachesList);
    
        }

    展开全文
  • 为了给自己一个警告,把这个问题记录下来 ...调用服务时的界面   出现的错误   坑的原因: 在使用RestTemplate的时候,千万别忘了加@LoadBalance注解     总结: 在SpringCloud...

    今天没事在搭建Eureka服务的时候,又一次犯了原来的错误,通过服务名调用不了已经注册的服务

    为了给自己一个警告,把这个问题记录下来

     

     

    这是Eureka中已经注册的服务列表

     

    调用服务时的界面

     

    出现的错误

     

    坑的原因:

    在使用RestTemplate的时候,千万别忘了加@LoadBalance注解

     

     

    总结:

    在SpringCloud中,有两种调用服务时客户端的负载均衡策略,一个是Ribbon,一个是Feign

    Ribbon是一个基于Http端的负载均衡,通过在Configuration中配置RestTemplate来进行调用,可以自定义负载均衡的方式

    Feign是一个通过本地接口的形式来进行调用服务的,其中Feign中默认引入了Ribbon,在线上开发中,我还是比较倾向用Feign,

    因为Feign中以接口的形式进行调用服务,看起来简洁,而且Feign中还可以增加熔断器,来进行服务的熔断和降级,防止服务调用中的服务的雪崩

     

     

     

     

    展开全文
  • 关于Eureka服务调用服务不通问题的查找1 .spring eureka相关的知识点请看该文章2.本人所遇到的问题是关于eureka消费方调用服务端时服务抛出异常 > ...
  • Feign调用服务各种坑处理

    千次阅读 2019-11-20 11:01:26
    1.编写被调用服务 @RefreshScope @RestController public class XXXController extends BaseController implements IndicatorsFeignApi{ @Resource private XXXService xxx; @Override public Wrapper&...
  • 本地提供/调用服务(spring)<bean id="demoService" class="com.demo.DemoServiceImpl" /><bean id="demoAction" class="com.action.DemoAction"> 其中,id为demoServ
  • nacos(注册中心)是通过 【 ip+端口】 的形式调用服务的。 docker容器使用虚拟ip 本地(开发电脑)直接调,肯定是不行的,因为容器的虚拟IP在我本地是不能ping通的 **问题:** 本地(我的开发电脑)...
  • OSB-380000:调用服务提供方服务错误:[OSB-381304]Exception in HttpOutboundMessageContext.RetrieveHttpResponseWork.run: java.io.IOException: SocketMuxer detected socket closure while waiting for a ...
  • 调用服务的几种方式

    千次阅读 2017-11-18 17:10:00
    我目前发现的有两种方式可以调用服务 1、rosservice call + 服务名 + 参数 这个服务名是 你写的服务器程序里面(详见ROS教程第14讲编写简单的服务器和客户端 (C++))18行 ros::ServiceServer service = n....
  • 通过bindService调用服务里面的方法

    千次阅读 2017-05-25 16:59:31
    通过bindService方式调用服务方法里面的过程  (1)、定义一个服务,服务里面有一个方法需要Activity调用。  (2)、定义一个中间人对象(IBinder)继承Binder;  (3)、在onbind方法里面把我们定义的中间人对象返回...
  • springcloud中使用Ribbon和Feign调用服务以及服务的高可用
  • SpringCloud消费方调用服务方失败 今天在学习Spring cloud时,实现RestTemplate远程调用时,出现了 java.net.UnknownHostException: service-member错误。 问题排查 1、首先看引入的Spring-cloud包是否正确。 <...
  • 天地图调用服务

    千次阅读 2019-01-22 14:24:11
    前段时间 ,天地图对服务调用方式做了升级,需要添加tk秘钥。 现整理了 天地图 服务服务地址:  矢量服务: http://t0.tianditu.com/vec_w/wmts?SERVICE=WMTS&amp;VERSION=1.0.0&amp;REQUEST=...
  • springboot调用服务器接口

    千次阅读 2019-02-25 11:22:22
    调用 API (Post或GET方法) 。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客: 全新的界面设计 ,将会带来全新的...
  • android五中方式调用服务service中的方法分别是 - 通过重复调用startService 来根据意图Intent传递的参数调用 - 通过Handle调用 - 通过bindService调用 - 通过AIDL调用 - 通过BroadcastReceiver调用再讲解...
  • 这是个什么问题,在本地可以调用 用服务器上的调用,服务端就没有反应
  • 解决办法:首先调用服务的Controller中使用@ModelAttribute没有错,将远程接口和服务提供者Controller中传参对象加上或者改为@RequestBody注解。
  • Android--调用服务里面的方法

    千次阅读 2013-09-27 11:02:50
    为了我们讲那个AIDL,我们今天先说一下,怎样在怎样调用服务里面的方法,其实调用服务里面的方法也很简单 就是使用bindService来启动一个服务,在绑定的时候拿到一个Binder对象 但是问题就来啦,拿到的Binder怎么...
  • feignclient调用服务,传递的中文数据成???问题,乱码问题 @PostMapping(value = "testController/person",produces = MediaType.APPLICATION_JSON_UTF8_VALUE ,consumes = "application/json;charset=UTF-8") v.....
  • WCF客户端调用服务

    千次阅读 2013-04-30 16:25:39
    一方面,将客户端服务调用请求从方法调用形式转换为消息形式,并将编码后的消息通过相应的传输协议发送到服务端;另一方面,对从传输层接受的回复消息进行解码转换成消息对象,并从回复消息对象中提取服务操作执行的...
  • 正常情况下ribbon是直接调用eureka来拉取服务的地址,当我们需要单独配置的时候只需要在配置文件增加以下配置。官方文档 例如我们配置user服务 user: ribbon: listOfServers: user1.test.com,user2.test.com ...
  • A服务是客户端 Feign方式写了一个接口,接口参数是request 如(大概是这样的): public String getName(HttpServletRequest request) B服务是一个微服务。有一个controller映射上面的接口 如 public ...
  • Python调用服务接口

    千次阅读 2017-01-09 14:08:27
    #! /usr/bin/env python # coding=utf-8 #################################...运行Python脚本,即可调用相应的接口修改数据库数据。 python ChangeCustomerRule.py text.txt text.txt中即为参数,以空格分隔
  • Feign客户端调用服务遇到的问题

    千次阅读 2019-03-12 15:37:31
    feign客户端调用eureka服务时首先会在注册中心获取服务列表,从而确定服务基本信息以及地址信息,所以首先必须保证你的feign客户端是可以注册到eureka注册中心上的,单独注册feign客户端服务是可以注册进去。...
  • dubbo发布和调用服务

    千次阅读 2018-08-07 19:18:58
    1.发布服务  &lt;!-- 声明需要暴露的服务接口 --&gt;  &lt;dubbo:protocol name="dubbo" port="9092"/&gt;  &lt;dubbo:service interface="IConfigReadService&...
  • 无意中发现了一个巨牛的人工智能教程,忍...消费者和服务提供者使用同样的eureka服务端注册中心地址,调用注册中心的服务 maven结构如下: application相关配置如下: spring.application.name=consumer-de...
  • springBoot+Dubbo+Zookeeper整合实现最简单的RPC调用服务(总结) 这一两天在学习Dubbo在集成springBoot、zookeeper、dubbo的时候遇到了一些问题,对这些问题进行一个总结和反思以及扩展思考。 一、首先是总结集成...
  • 服务接口确认了好几遍也都没问题,百度的结果是启动类没有加入@EnableFeignClients注解,或者是调用接口不一致……确认了 很多遍,以上说的这些问题都不存在,经过多次调试,发现无参调用没有问题,有参调用返回的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,276,350
精华内容 910,540
关键字:

调用服务