Java教程

微服务学习

本文主要是介绍微服务学习,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

微服务笔记3.0

一、RPC

RPC全称为remote procedure call,即远程过程调用。比如两台服务器A和B,A服务器上部署一个应用,B服务器上部署一个应用,A服务器上的应用想调用B服务器上的应用提供的方法,由于两个应用不在一个内存空间,不能直接调用,所以需要通过网络来表达调用的语义和传达调用的数据。它并不是一个具体的技术,而是指整个网络远程调用过程。

二、Dubbo简介

Apache Dubbo是一款高性能的Java RPC框架,可以和Spring框架无缝集成,核心功能就是实现跨网络远程调用。
Dubbo官网地址:http://dubbo.apache.org
Dubbo提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。

1.Dubbo架构

dubbo结构图

各节点角色说明:

节点角色名称
Provider暴露服务的服务提供方
Consumer调用远程服务的服务消费方
Registry服务注册与发现的注册中心
Monitor统计服务的调用次数和调用时间的监控中心
Container服务运行容器

图中,虚线都是异步访问,实线都是同步访问 蓝色虚线:在启动时完成的功能 红色虚线(实线)都是程序运行过程中执行的功能。
调用关系说明:

  1. 服务容器负责启动,加载,运行服务提供者。
  2. 服务提供者在启动时,向注册中心注册自己提供的服务。
  3. 服务消费者在启动时,向注册中心订阅自己所需的服务。
  4. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
  5. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
  6. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

2. 服务注册中心Zookeeper

在Dubbo架构图可以看到,Registry(服务注册中心)在其中起着至关重要的作用,它连接着微服务项目中的所有服务提供者和消费者,让服务之间的调用变得更加方便。Dubbo官方推荐使用Zookeeper作为服务注册中心。

2.1 Zookeeper简介

在这里插入图片描述Zookeeper的树形目录服务
流程说明:

1.服务提供者(Provider)启动时: 向 /dubbo/com.foo.BarService/providers 目录下写入自己的URL 地址
2.服务消费者(Consumer)启动时: 订阅 /dubbo/com.foo.BarService/providers 目录下的提供者URL 地址。并向 /dubbo/com.foo.BarService/consumers 目录下写入自己的 URL 地址
3.监控中心(Monitor)启动时: 订阅 /dubbo/com.foo.BarService 目录下的所有提供者和消费者URL 地址
下载地址:http://archive.apache.org/dist/zookeeper/

3. Dubbo实例

3.1服务提供方

1.创建maven工程,pom文件如下:

<properties> 
	<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	<maven.compiler.source>1.8</maven.compiler.source> 
	<maven.compiler.target>1.8</maven.compiler.target> 
	<spring.version>5.0.5.RELEASE</spring.version> 
</properties> 
<dependencies> 
	<dependency> 
		<groupId>org.springframework</groupId> 
		<artifactId>spring-context</artifactId> 
		<version>${spring.version}</version> 
	</dependency> 
	<dependency> 
		<groupId>org.springframework</groupId> 
		<artifactId>spring-beans</artifactId> 
		<version>${spring.version}</version> 
	</dependency> 
	<dependency> 
		<groupId>org.springframework</groupId> 
		<artifactId>spring-webmvc</artifactId> 
		<version>${spring.version}</version> 
	</dependency> 
	<dependency> 
		<groupId>org.springframework</groupId> 
		<artifactId>spring-jdbc</artifactId> 
		<version>${spring.version}</version> 
	</dependency>
	<dependency> 
		<groupId>org.springframework</groupId> 
		<artifactId>spring-aspects</artifactId> 
		<version>${spring.version}</version> 
	</dependency> 
	<dependency> 
		<groupId>org.springframework</groupId>
		<artifactId>spring-jms</artifactId> 
		<version>${spring.version}</version> 
	</dependency> 
	<dependency> 
		<groupId>org.springframework</groupId> 
		<artifactId>spring-context-support</artifactId> 
		<version>${spring.version}</version> 
	</dependency> 
	<!-- dubbo相关 --> 
	<dependency> 
		<groupId>com.alibaba</groupId> 
		<artifactId>dubbo</artifactId> 
		<version>2.6.0</version> 
	</dependency> 
	<dependency> 
		<groupId>org.apache.zookeeper</groupId> 
		<artifactId>zookeeper</artifactId> 
		<version>3.4.7</version> 
	</dependency> 
	<dependency> 
		<groupId>com.github.sgroschupf</groupId> 
		<artifactId>zkclient</artifactId> 
		<version>0.1</version> 
	</dependency> 
	<dependency> 
		<groupId>javassist</groupId> 
		<artifactId>javassist</artifactId> 
		<version>3.12.1.GA</version>
	</dependency> 
	<dependency> 
		<groupId>com.alibaba</groupId> 
		<artifactId>fastjson</artifactId> 
		<version>1.2.47</version> 
	</dependency> 
</dependencies> 
<build> 
	<plugins> 
		<plugin> 
			<groupId>org.apache.maven.plugins</groupId> 
			<artifactId>maven-compiler-plugin</artifactId> 
			<version>2.3.2</version> 
			<configuration> 
				<source>1.8</source> 
				<target>1.8</target> 
			</configuration> 
		</plugin> 
		<plugin> 
			<groupId>org.apache.tomcat.maven</groupId> 
			<artifactId>tomcat7-maven-plugin</artifactId> 
			<configuration> 
				<!-- 指定端口 -->
				<port>8081</port> 
				<!-- 请求路径 --> 
				<path>/</path> 
			</configuration> 
		</plugin> 
	</plugins> 
</build>

2.配置web.xml文件

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > 
<web-app> 
	<display-name>Archetype Created Web Application</display-name> 
<context-param> 
	<param-name>contextConfigLocation</param-name> 
	<param-value>classpath:applicationContext*.xml</param-value> 
</context-param> 
<listener> 
	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 
</web-app>

3.服务接口

package com.lxs.service;
 public interface HelloService { 
 	public String sayHello(String name); 
 }

4.服务实现类

package com.lxs.service.impl; 
import com.alibaba.dubbo.config.annotation.Service; 
import com.lxs.service.HelloService; 
@Service //该注解是dubbo的注解,不是springboot的
public class HelloServiceImpl implements HelloService { 
	public String sayHello(String name) { 
	return "hello " + name; 
	} 
}

5.在src/main/resources下创建applicationContext-service.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" 
	xmlns:mvc="http://www.springframework.org/schema/mvc" 
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
	http://www.springframework.org/schema/beans/spring-beans.xsd 
	http://www.springframework.org/schema/mvc 
	http://www.springframework.org/schema/mvc/spring-mvc.xsd 
	http://code.alibabatech.com/schema/dubbo 
	http://code.alibabatech.com/schema/dubbo/dubbo.xsd 
	http://www.springframework.org/schema/context 
	http://www.springframework.org/schema/context/spring-context.xsd"> 
	<!-- 当前应用名称,用于注册中心计算应用间依赖关系,注意:消费者和提供者应用名不要一样 --> 
	<dubbo:application name="dubbodemo_provider" /> 
	<!-- 连接服务注册中心zookeeper ip为zookeeper所在服务器的ip地址--> 
	<dubbo:registry address="zookeeper://192.168.134.129:2181"/> 
	<!-- 注册 协议和port --> 
	<dubbo:protocol name="dubbo" port="20881"></dubbo:protocol> 
	<!-- 扫描指定包,加入@Service注解的类会被发布为服务 --> 
	<dubbo:annotation package="com.lxs.service.impl" /> 
</beans>	

6.启动

3.2 服务消费方开发

1.创建maven工程(打包方式为war)dubbodemo_consumer,pom.xml配置和上面服务提供者相同,只需要将Tomcat插件的端口号改为8082即可
2.配置web.xml文件

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > 
<web-app> 
	<display-name>Archetype Created Web Application</display-name> 
	<servlet> 
		<servlet-name>springmvc</servlet-name> 
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
	<!-- 指定加载的配置文件 ,通过参数contextConfigLocation加载 --> 
		<init-param> 
			<param-name>contextConfigLocation</param-name> 
			<param-value>classpath:applicationContext-web.xml</param-value> 
		</init-param> 
		<load-on-startup>1</load-on-startup> 
	</servlet> 
	<servlet-mapping> 
		<servlet-name>springmvc</servlet-name> 
		<url-pattern>*.do</url-pattern> 
	</servlet-mapping> 
</web-app>

3.这里可以使用之前在服务提供者中写好的HelloService接口
4.编写Controller

package com.lxs.controller; 
import com.alibaba.dubbo.config.annotation.Reference; 
import com.lxs.service.HelloService; 
import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.ResponseBody; @Controller @RequestMapping("/demo") 
public class HelloController { 
	@Reference //这里是是Dubbo提供的@Reference注解
	private HelloService helloService; 
	@RequestMapping("/hello") 
	@ResponseBody 
	public String getName(String name){ 
	//远程调用 
	String result = helloService.sayHello(name);
	System.out.println(result); return result; 
	} 
}

5.在src/main/resources下创建applicationContext-web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xmlns:p="http://www.springframework.org/schema/p" 
	xmlns:context="http://www.springframework.org/schema/context" 
	xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" 
	xmlns:mvc="http://www.springframework.org/schema/mvc" 
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
	http://www.springframework.org/schema/beans/spring-beans.xsd 
	http://www.springframework.org/schema/mvc 
	http://www.springframework.org/schema/mvc/spring-mvc.xsd 
	http://code.alibabatech.com/schema/dubbo 
	http://code.alibabatech.com/schema/dubbo/dubbo.xsd 
	http://www.springframework.org/schema/context 
	http://www.springframework.org/schema/context/spring-context.xsd"> 
	<!-- 当前应用名称,用于注册中心计算应用间依赖关系,注意:消费者和提供者应用名不要一样 --> 
	<dubbo:application name="dubbodemo-consumer" /> 
	<!-- 连接服务注册中心zookeeper ip为zookeeper所在服务器的ip地址--> 
	<dubbo:registry address="zookeeper://192.168.134.129:2181"/> 
	<!-- 扫描的方式暴露接口 --> 
	<dubbo:annotation package="com.lxs.controller" /> 
</beans>

6.运行测试
在浏览器输入:http://localhost:8082/demo/hello.do?name=Jack

这篇关于微服务学习的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!