Java面试系列总结 :WebService/Restful/solr

1. 什么是webService?

WebService 是一种跨编程语言和跨操作系统平台的远程调用技术。所谓跨编程语言和跨操作平台,就是说服务端程序采用 java 编写,客户端程序则可以采用其他编程语言编写,反之亦然!跨操作系统平台则是指服务端程序和客户端程序可以在不同的操作系统上。

2. 常见的远程调用技术

RMI是java语言本身提供的远程通讯协议,稳定高效,是EJB的基础。但它只能用于JAVA程序之间的通讯。

Hessian和Burlap是caucho公司提供的开源协议,基于HTTP传输,服务端不用开防火墙端口。协议的规范公开,可以用于任意语言。跨平台有点小问题。

Httpinvoker是SpringFramework提供的远程通讯协议,只能用于JAVA程序间的通讯,且服务端和客户端必须使用SpringFramework。

Web service是连接异构系统或异构语言的首选协议,它使用SOAP形式通讯,可以用于任何语言,目前的许多开发工具对其的支持也很好。

效率相比:RMI > Httpinvoker >= Hessian >> Burlap >> web service。

3. 谈谈你对restful的理解以及在项目中的使用?

注意:下面回答内容来自百度百科。

一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。REST 指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是 RESTful。它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。

给大家推荐如下一篇博客,该博客从多个维度讲解了什么是Restful并且给了Restful风格样式的API接口。
http://blog.youkuaiyun.com/liuwenbiao1203/article/details/52351129

4. 简单介绍一下solr

Solr 是一个独立的企业级搜索应用服务器,它对外提供类似于 Web-service 的 API 接口。 用户可以通过 http 请求,向搜索引擎服务器提交一定格式的 XML 文件,生成索引;也可以 通过 Http Get 操作提出查找请求,并得到 XML 格式的返回结果。

特点:

Solr 是一个高性能,采用 Java5 开发,基于 Lucene 的全文搜索服务器。同时对其进行 了扩展,提供了比 Lucene 更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能 进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎。

工作方式:

文档通过 Http 利用 XML 加到一个搜索集合中。查询该集合也是通过 http 收到一个 XML/JSON 响应来实现。它的主要特性包括:高效、灵活的缓存功能,垂直搜索功能,高亮 显示搜索结果,通过索引复制来提高可用性,提供一套强大 Data Schema 来定义字段,类 型和设置文本分析,提供基于 Web 的管理界面等。

5. solr怎么设置搜索结果排名靠前?

可以设置文档中域的 boost 值,boost 值越高,计算出来的相关度得分就越高,排名也就越靠前。此方法可以把热点商品或者推广商品的排名提高。

6. solr中IK分词器原理是什么?

Ik 分词器的分词原理本质上是词典分词。先在内存中初始化一个词典,然后在分词过程中挨个读取字符,和字典中的字符相匹配,把文档中的所有的词语拆分出来的过程。

欢迎关注作者的公众号《Java编程生活》,每日记载Java程序猿工作中遇到的问题
在这里插入图片描述

<think> 我们正在讨论Dubbo中使用WebService协议时,服务注册地址和实际访问地址的关系。 根据Dubbo官方文档,当使用WebService协议时,Dubbo会将服务以WebService的形式暴露出来。 在注册中心(如Zookeeper)中,服务提供者的URL会以特定的格式存储,例如:webservice://192.168.1.10:8080/com.xx.UserService。 这个URL是Dubbo内部使用的服务提供者地址,它使用了一个自定义的协议名“webservice”,但实际上该服务是通过HTTP协议对外提供WebService服务的。 实际调用时,客户端(如手机端)需要通过HTTP协议来访问WebService服务。WebService服务通常有两个重要的URL: 1. 服务端点(Endpoint):用于接受SOAP请求,例如:http://192.168.1.10:8080/com.xx.UserService 2. WSDL文档地址:用于描述服务,例如:http://192.168.1.10:8080/com.xx.UserService?wsdl 因此,我们需要将Dubbo注册的URL(webservice://192.168.1.10:8080/com.xx.UserService)转换为实际的HTTP地址。 转换规则: 1. 协议替换:将“webservice://”替换为“http://”(因为WebService实际使用HTTP传输)。 2. 添加WSDL查询参数:为了获取WSDL文档,需要在URL后面添加“?wsdl”。 所以,webservice://192.168.1.10:8080/com.xx.UserService 对应的WSDL地址就是: http://192.168.1.10:8080/com.xx.UserService?wsdl 另外,根据引用[1]中的例子,Axis2生成的WSDL地址为:http://localhost:8080/axis2/services/CalculatorService?wsdl,这进一步验证了WSDL地址的格式。 同时,引用[2]中提到了通过注解修改服务访问点名称,这可能会影响生成的URL,但基本结构不变。 总结关系: - Dubbo内部注册的URL使用自定义协议头“webservice”来标识这是一个WebService协议的服务。 - 实际访问时,必须通过HTTP协议访问,且WSDL文档的获取是在服务端点URL后加上“?wsdl”。 因此,这两个地址实际上是同一个服务的不同表示: webservice://192.168.1.10:8080/com.xx.UserService 是Dubbo在注册中心中表示服务提供者的URL。 http://192.168.1.10:8080/com.xx.UserService?wsdl 是实际用于获取服务描述文档(WSDL)的HTTP地址。 </think>### WebService协议地址与HTTP地址的关系详解 `webservice://192.168.1.10:8080/com.xx.UserService` 与 `http://192.168.1.10:8080/com.xx.UserService?wsdl` 的关系如下: ```mermaid graph LR A[webservice协议地址] -->|Dubbo内部表示| B[webservice://192.168.1.10:8080/com.xx.UserService] A -->|实际访问| C[http://192.168.1.10:8080/com.xx.UserService] C -->|获取服务描述| D[?wsdl参数] D --> E[http://192.168.1.10:8080/com.xx.UserService?wsdl] ``` #### 一、核心关系 1. **协议转换关系** `webservice://` 是 Dubbo 内部的协议标识符,实际通信时会被转换为标准 HTTP 协议: $$ \text{webservice://} \rightarrow \text{http://} $$ 2. **功能关系** - **无参数地址**:`http://192.168.1.10:8080/com.xx.UserService` ▸ 服务端点(Endpoint):接收 SOAP 请求的实际接口 ▸ 示例请求: ```xml <soap:Envelope> <soap:Body> <ns2:getUser xmlns:ns2="http://service.xx.com/"/> </soap:Body> </soap:Envelope> ``` - **带参数地址**:`http://...?wsdl` ▸ 服务描述文件:包含服务接口的 WSDL 定义[^1][^2] ▸ 作用:客户端据此生成代理类(如 Axis2/CXF 生成的 `ObjectFactory`, `SayHelloResponse` 等[^4]) #### 二、技术实现对比 | **特性** | `webservice://` 地址 | `http://...?wsdl` 地址 | |---------|----------------------|------------------------| | 协议类型 | Dubbo 自定义协议标识 | 标准 HTTP 协议 | | 使用场景 | Dubbo 注册中心存储 | 客户端获取服务定义 | | 数据格式 | 二进制元数据 | XML 格式的 WSDL 文档 | | 访问方式 | Dubbo 内部解析 | 浏览器/HTTP 客户端直接访问 | | 内容 | 服务元信息(IP/端口/接口) | 完整的服务契约定义 | #### 三、地址转换过程 Dubbo 服务注册时: ```java // Dubbo 内部处理(简化代码) String serviceURL = "webservice://192.168.1.10:8080/com.xx.UserService"; registry.register(URL.valueOf(serviceURL)); // 注册到Zookeeper ``` 客户端使用时: 1. 从注册中心获取 `webservice://` 地址 2. 转换为 HTTP 地址:`http://192.168.1.10:8080/com.xx.UserService` 3. 添加 `?wsdl` 获取描述文件: ```java String wsdlURL = httpURL + "?wsdl"; // 生成WSDL地址 ``` #### 四、注解定制能力(参考引用[2]) 可通过注解修改 WSDL 元素: ```java @WebService( serviceName = "UserServices", // 修改服务名 portName = "userServicePort", // 修改端口名 targetNamespace = "http://user.xx.com" // 修改命名空间 ) public class UserServiceImpl implements UserService { @WebMethod @WebResult(name = "userResponse") // 修改返回标签 public String getUser(@WebParam(name = "userId") String id) { return "User_" + id; } } ``` 修改后 WSDL 地址不变,但文档内容变化[^2][^3] #### 五、实际调用示例 生成客户端代理(引用[4]): ```java // CXF动态客户端 DynamicClientFactory dcf = DynamicClientFactory.newInstance(); Client client = dcf.createClient("http://...?wsdl"); Object[] res = client.invoke("getUser", "1001"); // 调用服务端点 ``` > **关键结论**: > `webservice://` 是 Dubbo 内部使用的**协议标识符**,而 `http://...?wsdl` 是实际对外暴露的**服务描述文件地址**。两者指向同一个服务,但前者用于服务发现,后者用于客户端生成调用代码[^1][^2][^4]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值