传统应用带来的问题
1、单一业务开发和迭代困难
2、扩容困难
3、部署和回滚困难
微服务发展历程
- 面向服务开发 - SOA(Service-Oriented Architecture)
- 微服务开发
微服务概述
- 微服务是一种将业务系统进一步拆分的架构风格
- 微服务强调每一个单一业务都独立运行
- 每一个单一服务都应该使用更轻量的机制保持通信
- 服务不强调环境,可以不同语言或数据源
微服务选择
- Dubbo
- Spring Cloud
- Zero ICE
Guns + SpringBoot + Dubbo
Spring + Dubbo
SpringBoot + Dubbo
微服务基本概念
- Provider:服务提供者,提供服务实现
- Consumer:服务调用者,调用Provider提供的服务实现
- 同一个服务可以即是Provider,又是Consumer
本次采用 Guns + SpringBoot + Dubbo 进行处理
直连提供者
- 消费端知道服务提供者的地址,直接进行连接
- 该种方式一般只在测试环境中使用
- 直连提供者限制了分布式的易扩展性
基于Apache Dubbo结合Springboot构建开发环境
基于springboot的dubbo开发
采用分布式的配置Provider和Consumer
pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- <parent>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-starter-parent</artifactId>-->
<!-- <version>2.1.6.RELEASE</version>-->
<!-- <relativePath/> <!– lookup parent from repository –>-->
<!-- </parent>-->
<groupId>com.roger.dubbo</groupId>
<artifactId>provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>provider</name>
<description>provider for Spring Boot dubbo</description>
<properties>
<java.version>1.8</java.version>
<lombok.version>1.18.4</lombok.version>
<dubbo.version>2.6.5</dubbo.version>
<dubbo-spring-boot-starter.version>0.2.0</dubbo-spring-boot-starter.version>
<fastjson.version>1.2.55</fastjson.version>
<spring-context-support.version>1.0.2</spring-context-support.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>io.spring.platform</groupId>
<artifactId>platform-bom</artifactId>
<version>Cairo-SR6</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- <dependency>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-devtools</artifactId>-->
<!-- <optional>true</optional> <!– 表示依赖不会传递 –>-->
<!-- </dependency>-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<!-- Springboot 集成 Dubbo 的依赖 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>${dubbo-spring-boot-starter.version}</version>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
</dependency>
<!--使用 dubbo 2.6.5 版本必须添加 spring-context-support 否则会报错-->
<dependency>
<groupId>com.alibaba.spring</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring-context-support.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<!--编译插件-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<!-- 配置使用的 jdk 版本 -->
<target>1.8</target>
<source>1.8</source>
</configuration>
</plugin>
<!--springboot-maven打包插件-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!--资源拷贝插件-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!--实现热部署插件-->
<!-- <plugin>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-maven-plugin</artifactId>-->
<!-- <configuration>-->
<!-- <fork>true</fork> <!– 如果没有该配置,devtools不会生效 –>-->
<!-- </configuration>-->
<!-- </plugin>-->
</plugins>
<!--IDEA是不会编译src的java目录的xml文件,如果需要读取,则需要手动指定哪些配置文件需要读取-->
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*</include>
</includes>
</resource>
</resources>
</build>
</project>
注意其中基于springboot模板生成的项目会自动带有spring-boot-starter-parent
依赖,会与io.spring.platform
依赖冲突,报错为:
Exception in thread "main" java.lang.AbstractMethodError: org.springframework.boot.context.config.ConfigFileApplicationListener.supportsSourceType(Ljava/lang/Class;)
Provider
application.properties配置
server.port=8091
dubbo.application.id=dubbo-provider
dubbo.application.name=dubbo-provider
dubbo.registry.address=zookeeper://localhost:2181
dubbo.protocol.server=true
dubbo.protocol.name=dubbo
dubbo.protocol.port=20800
dubbo.scan.base-packages=com.roger.dubbo
Consumer
application.properties配置
server.port=8093
dubbo.application.id=dubbo-consumer
dubbo.application.name=dubbo-consumer
dubbo.registry.address=zookeeper://localhost:2181
dubbo.protocol.name=dubbo
dubbo.protocol.port=20800
dubbo.scan.base-packages=com.roger.dubbo
dubbo.consumer.check=false