前言
咱们后面的博客曾经学习了 springboot
如何整合 dubbo
框架
springboot 整合 dubbo
在整合 SpringCloud
前,大家有没有想过他和 dubbo
有什么差别:
- 起源(背景):
Dubbo
,是阿里巴巴服务化治理的外围框架,并被广泛应用于阿里巴巴团体的各成员站点。Spring Cloud
,从命名咱们就能够晓得,它是 Spring Source 的产物,Spring 社区的弱小背书能够说是 Java 企业界最有影响力的组织了,除了 Spring Source 之外,还有 Pivotal 和 Netfix 是其弱小的后盾与技术输入。其中 Netflix 开源的整套微服务架构套件是 Spring Cloud 的外围。简而言之dubbo
是阿里写的属于国产,springcloud
属于国际版利用更广。
2.注册核心: dubbo
反对的注册核心为:Zookeeper(官网举荐)
、Multicast
、Redis
、Simple
,咱们罕用为 zk。springcloud
反对的注册核心有 Eureka
、Zookeeper
、Consul
、Nacos
, 各个注册核心的区别请查阅 springcloud 四个注册核心的比拟这里我应用的是曾经闭源的Eureka
。ZooKeeper
是个 CP
强一致性和分区容错性,而 Eureka
为AP
准则,舍弃了强一致性,保障了高可用。
- 传输:
Dubbo
因为是二进制的传输,占用带宽会更少;Spring Cloud
是 http 协定传输,带宽会比拟多,同时应用 http 协定个别会应用 JSON 报文,耗费会更大。然而在国内 95% 的公司内,网络耗费不是什么太大问题,如果真的成了问题,通过压缩、二进制、高速缓存、分段降级等办法,很容易解。 - 开发难度:
Dubbo
的开发难度较大,起因是 dubbo 的 jar 包依赖问题很多大型工程无奈解决;Spring Cloud
的接口协议约定比拟自在且涣散,须要有强有力的行政措施来限度接口无序降级 - 后续改良:
Dubbo
通过 dubbofilter,很多货色没有,须要本人继承,如监控,如日志,如限流,如追踪 - 配置核心: dubbo:如果咱们应用配置核心、分布式跟踪这些内容都须要本人去集成,无形中减少了应用难度。
- 核心部件的比拟:
Dubbo:
- Provider:裸露服务的提供方,能够通过 jar 或者容器的形式启动服务。
- Consumer:调用近程服务的服务生产方。
- Registry:服务注册核心和发现核心。
- Monitor:统计服务和调用次数,调用工夫监控核心。(Dubbo 的控制台页面中能够显示,目前只有一个简略版本。)
- Container:服务运行的容器。
Spring Cloud:
- Service Provider:裸露服务的提供方。
- Service Consumer:调用近程服务的服务生产方。
- EureKa Server:服务注册核心和服务发现核心。
Spring Cloud:提供了微服务的一整套解决方案:服务发现注册、配置核心、音讯总线、负载平衡、断路器、数据监控等
- 架构的残缺度:
Dubbo
只是实现了服务治理;Spring Cloud
上面有 17 个子我的项目(可能还会新增)别离笼罩了微服务架构下的方方面面,服务治理只是其中的一个方面;肯定水平来说,Dubbo 只是 Spring Cloud Netflix 中的一个子集。 - 服务依赖形式: Dubbo:服务提供方与生产方通过接口的形式依赖,服务调用设计如下:
- Interface 层:服务接口层,定义了服务对外提供的所有接口。
- Molel 层:服务的 DTO 对象层。
- Business 层:业务实现层,实现 Interface 接口并且和 DB 交互。
因而须要为每个微服务定义各自的 Interface 接口,并通过继续集成公布到公有仓库中。调用方利用对微服务提供的形象接口存在强依赖关系,开发、测试、集成环境都须要严格的治理版本依赖。
Spring Cloud:
服务提供方和服务生产方通过 Json 形式交互,因而只须要定义好相干 Json 字段即可,生产方和提供方无接口依赖。通过注解形式来实现服务配置,对于程序有肯定入侵。
通过 Json 交互,省略了版本治理的问题,然而具体字段含意须要对立治理,本身 Rest API 形式交互,为跨平台调用奠定了根底。
总体:
Dubbo:应用 Dubbo 构建的微服务架构就像组装电脑,各环节咱们的抉择自由度很高,然而最终后果很有可能因为一条内存品质不行就点不亮了,总是让人不怎么释怀,然而如果你是一名高手,那这些都不是问题;
Spring Cloud 就像品牌机,在 Spring Source 的整合下,做了大量的兼容性测试,保障了机器领有更高的稳定性,然而如果要在应用非原装组件外的货色,就须要对其根底有足够的理解。
优缺点(综上失去):
Dubbo
长处:
1. 反对各种通信协议,而且生产方和服务方应用长链接形式交互,通信速度上略胜;
2. 采纳 rpc 形式,性能上比 Spring Cloud 的 rpc 更好;
3.dubbo 的网络耗费小于 springcloud
毛病:
1. 如果咱们应用配置核心、分布式跟踪这些内容都须要本人去集成;
2. 开发难度较大,起因是 dubbo 的 jar 包依赖问题很多大型工程无奈解决;
3.
Spring Cloud:
长处:
1、产出于 Spring 大家族,Spring 在企业级开发框架中来头很大,能够保障后续的更新、欠缺。
2、spring cloud 社区沉闷,教程丰盛,遇到问题很容易找到解决方案;
3、spring cloud 性能比 dubbo 更加欠缺;
5、spring cloud 采纳 rest 拜访形式,rest 的技术无关性应用成果更棒;
6、spring cloud 轻轻松松几行代码就实现了熔断、平衡负责、服务中心的各种平台性能;
7、从公司招聘工程师方面,spring cloud 更有劣势,因为其技术更新更炫;
8、提供了微服务的一整套解决方案:服务发现注册、配置核心、音讯总线、负载平衡、断路器、数据监控等;作为一个微服务治理的大家伙,思考的很全面,简直服务治理的方方面面都思考到了,不便开发开箱即用;
毛病:
1. 如果对于零碎的响应工夫有严格要求,长链接更适合。
2. 接口协议约定比拟自在且涣散,须要有强有力的行政措施来限度接口无序降级
参考自:
https://blog.csdn.net/u010664947/article/details/80007767
https://blog.csdn.net/zuiyingong6567/article/details/80229310
创立我的项目
应用 Spring Initializr
新建一个我的项目命名为:springcloud-parent
,删除多余的文件,并新建三个子模块别离为:springcloud-eureka-server
、springcloud-member
、springcloud-order
父工程 pom.xml
配置文件spring-boot
版本这里选用 2.0.1.RELEASE
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<packaging>pom</packaging>
<modules> <module>springcloud-eureka-server</module>
<module>springcloud-member</module>
<module>springcloud-order</module>
</modules> <parent> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.baba.wlb</groupId>
<artifactId>springcloud-parent</artifactId>
<version>1.0-SNAPSHOT</version>
<name>springcloud-parent</name>
<description>Demo project for Spring Boot</description>
<properties> <java.version>1.8</java.version>
</properties>
<dependencies> <dependency> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency> <dependency> <groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency> <dependency> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude> </excludes> </configuration> </plugin> </plugins> </build>
</project>
子模块
springcloud-eureka-server
模块:
pom.xml
文件:
<?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">
<parent> <artifactId>springcloud-parent</artifactId>
<groupId>com.baba.wlb</groupId>
<version>1.0-SNAPSHOT</version>
</parent> <modelVersion>4.0.0</modelVersion>
<artifactId>springcloud-eureka-server</artifactId>
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.M7</version>
<type>pom</type>
<scope>import</scope>
</dependency> </dependencies> </dependencyManagement>
<dependencies> <!--SpringCloud Eureka Server-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency> </dependencies>
<!-- 留神:这里必须增加,否则各种依赖有问题 -->
<repositories>
<repository> <id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/libs-milestone</url>
<snapshots> <enabled>false</enabled>
</snapshots> </repository> </repositories></project>
application.yml
配置文件:
## 服务端口号
server:
port: 8100
eureka:
instance:
## 服务注册核心 ip 地址
hostname: 127.0.0.1
client:
serviceUrl:
## 注册地址
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
## 因为本人是注册核心,是否须要本人将本人注册到注册核心(集群的时候为 true)
register-with-eureka: false
## 因为本人是注册核心,不须要去检索服务信息
fetch-registry: false
EurekaServerApplication
启动类:
package com.baba.wlb;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
//@EnableEurekaServer 示意开启 Eureka 服务 开启注册核心
public static void main(String[] args) {SpringApplication.run(EurekaServerApplication.class, args);
}
}
springcloud-member
模块:
pom.xml
文件
<?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">
<parent> <artifactId>springcloud-parent</artifactId>
<groupId>com.baba.wlb</groupId>
<version>1.0-SNAPSHOT</version>
</parent> <modelVersion>4.0.0</modelVersion>
<artifactId>springcloud-member</artifactId>
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.M7</version>
<type>pom</type>
<scope>import</scope>
</dependency> </dependencies> </dependencyManagement>
<dependencies> <!--Springboot 整合 web 组件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--SpringBoot 整合 eureka 客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
<!-- 留神:这里必须增加,否则各种依赖有问题 -->
<repositories>
<repository> <id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/libs-milestone</url>
<snapshots> <enabled>false</enabled>
</snapshots> </repository> </repositories></project>
application.yml
配置文件:
spring:
profiles:
active: dev
application-dev.yml
配置文件:
## 服务端口号
server:
port: 8000
spring:
application:
## 服务别名 -- 服务注册到 Eureka 名称
name: app-member
eureka:
client:
service-url:
## 以后服务注册到 Eureka 服务地址
defaultZone: http://localhost:8100/eureka
register-with-eureka: true
## 须要检索服务信息
fetch-registry: true
application-prod.yml
配置文件:
## 服务端口号
server:
port: 8010
spring:
application:
## 服务别名 -- 服务注册到 Eureka 名称
name: app-member
eureka:
client:
service-url:
## 以后服务注册到 Eureka 服务地址
defaultZone: http://localhost:8100/eureka
register-with-eureka: true
## 须要检索服务信息
fetch-registry: true
MemberApiController
管制页面:
package com.baba.wlb.api.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Author wulongbo
* @Date 2021/1/9 15:20
* @Version 1.0
*/@RestController
public class MemberApiController {@Value("${server.port}")
private String serverPort;
@RequestMapping("/getMember")
public String getMember() {return "我是会员服务! 端口号:"+serverPort;}
}
AppMember.java
启动类:
package com.baba.wlb.api.controller;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
/**
* @Author wulongbo
* @Date 2021/1/9 15:22
* @Version 1.0
*/
@EnableEurekaClient
@SpringBootApplication
public class AppMember {public static void main(String[] args) {SpringApplication.run(AppMember.class,args);
}
}
springcloud-order
模块:
pom.xml
文件
<?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">
<parent> <artifactId>springcloud-parent</artifactId>
<groupId>com.baba.wlb</groupId>
<version>1.0-SNAPSHOT</version>
</parent> <modelVersion>4.0.0</modelVersion>
<artifactId>springcloud-order</artifactId>
<!-- 治理依赖 -->
<dependencyManagement>
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.M7</version>
<type>pom</type>
<scope>import</scope>
</dependency> </dependencies> </dependencyManagement>
<dependencies> <!--Springboot 整合 web 组件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--SpringBoot 整合 eureka 客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
<!-- 留神:这里必须增加,否则各种依赖有问题 -->
<repositories>
<repository> <id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/libs-milestone</url>
<snapshots> <enabled>false</enabled>
</snapshots> </repository> </repositories></project>
application.yml
配置文件:
## 服务端口号
server:
port: 8200
spring:
application:
## 服务别名 -- 服务注册到 Eureka 名称
name: app-order
eureka:
client:
service-url:
## 以后服务注册到 Eureka 服务地址
defaultZone: http://localhost:8100/eureka
register-with-eureka: true
## 须要检索服务信息
fetch-registry: true
OrderApiController
管制页面:
springCloud 中,两种形式调用(rest/feign)
package com.baba.wlb.api.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
/**
* @Author wulongbo
* @Date 2021/1/9 15:32
* @Version 1.0
*/@RestController
public class OrderApiController {
@Autowired
private RestTemplate restTemplate;
/**
* springCloud 中,两种形式调用(rest/feign)*
* @return
*/
// 订单服务调用会员服务
@RequestMapping("/getOrder")
public String getOrder() {
// 有两种调用形式,一种是采纳服务别名形式调用,另一种是应用别名去注册核心上获取对应服务调用地址
// 第一种形式
String url = "http://dy-202006281547:8000/getMember";
// 第二种形式
url = "http://app-member/getMember";
String result = restTemplate.getForObject(url, String.class);
return "订单服务调用会员服务:" + result;
}
}
AppOrder.java
启动类:
在启动类中注入RestTemplate
bean 对象。
package com.baba.wlb.api.controller;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
/**
* @Author wulongbo
* @Date 2021/1/9 15:39
* @Version 1.0
*/@SpringBootApplication
@EnableEurekaClient
public class AppOrder {public static void main(String[] args) {SpringApplication.run(AppOrder.class,args);
// 第二种形式 如果应用 rest 形式以别名形式进行调用依赖 ribbon 负载均衡器
// 第二种形式 @LoadBalanced 能让 restTemplate 模板在申请时领有客户端负载平衡的能力
}
// 解决 RestTemplate 找不到起因,把 RestTemplate 注册到 Springboot 容器中 @Bean
// 第一种形式
// @Bean
// RestTemplate restTemplate(){// return new RestTemplate();
// }
// 第二种形式 @LoadBalanced 能让 restTemplate 模板在申请时领有客户端负载平衡的能力
@Bean
@LoadBalanced RestTemplate restTemplate(){return new RestTemplate();
}
}
启动我的项目
启动 EurekaServerApplication
Eureka 服务 开启注册核心
启动 member
服务:
- 启动
AppMember.java
, 加载的是 dev 开发环境
并拜访 http://localhost:8100/,能够看到注册了别名为 APP-MEMBER
的服务
- 再启动生产环境,这里咱们应用间接启动 jar 包的形式
- 找到 jar 包地位
为:E:\ideaworkspaceback\springcloud-parent\springcloud-eureka-server\target
2. 关上 Terminal
3. 执行命令:java -jar E:\ideaworkspaceback\springcloud-parent\springcloud-member\target\springcloud-member-1.0-SNAPSHOT.jar --spring.profiles.active=prod
启动生产环境
4. 拜访 http://localhost:8100/,能够看到注册了别名为 APP-MEMBER
的服务有两个
咱们点击上图服务地址,并批改 http://dy-202006281547:8000/info
为http://dy-202006281547:8000/getMember
即可拜访 member 服务
启动 order
服务:
启动 AppOrder.java
并拜访 http://localhost:8100/,能够看到注册了别名为 APP-ORDER
的服务
测试
Postman 拜访 localhost:8084/orderToMember
屡次提交可发现做了负载平衡。
总结
springcloud 集成 Eureka 还是很简略,应用注解就完事了!