前言

咱们后面的博客曾经学习了 springboot 如何整合 dubbo 框架
springboot整合dubbo

在整合 SpringCloud 前,大家有没有想过他和 dubbo 有什么差别:

  1. 起源(背景): Dubbo,是阿里巴巴服务化治理的外围框架,并被广泛应用于阿里巴巴团体的各成员站点。Spring Cloud,从命名咱们就能够晓得,它是Spring Source的产物,Spring社区的弱小背书能够说是Java企业界最有影响力的组织了,除了Spring Source之外,还有Pivotal和Netfix是其弱小的后盾与技术输入。其中Netflix开源的整套微服务架构套件是Spring Cloud的外围。简而言之dubbo是阿里写的属于国产,springcloud 属于国际版利用更广。

2.注册核心: dubbo反对的注册核心为:Zookeeper(官网举荐)MulticastRedisSimple,咱们罕用为zk。springcloud 反对的注册核心有EurekaZookeeperConsulNacos,各个注册核心的区别请查阅springcloud四个注册核心的比拟这里我应用的是曾经闭源的EurekaZooKeeper是个CP强一致性和分区容错性,而EurekaAP准则,舍弃了强一致性,保障了高可用。

  1. 传输: Dubbo因为是二进制的传输,占用带宽会更少;Spring Cloud是http协定传输,带宽会比拟多,同时应用http协定个别会应用JSON报文,耗费会更大。然而在国内95%的公司内,网络耗费不是什么太大问题,如果真的成了问题,通过压缩、二进制、高速缓存、分段降级等办法,很容易解。
  2. 开发难度: Dubbo的开发难度较大,起因是dubbo的jar包依赖问题很多大型工程无奈解决;Spring Cloud的接口协议约定比拟自在且涣散,须要有强有力的行政措施来限度接口无序降级
  3. 后续改良: Dubbo通过dubbofilter,很多货色没有,须要本人继承,如监控,如日志,如限流,如追踪
  4. 配置核心: dubbo:如果咱们应用配置核心、分布式跟踪这些内容都须要本人去集成,无形中减少了应用难度。
  5. 核心部件的比拟:

Dubbo:

  • Provider:裸露服务的提供方,能够通过 jar 或者容器的形式启动服务。
  • Consumer:调用近程服务的服务生产方。
  • Registry:服务注册核心和发现核心。
  • Monitor:统计服务和调用次数,调用工夫监控核心。(Dubbo 的控制台页面中能够显示,目前只有一个简略版本。)
  • Container:服务运行的容器。

Spring Cloud:

  • Service Provider: 裸露服务的提供方。
  • Service Consumer:调用近程服务的服务生产方。
  • EureKa Server: 服务注册核心和服务发现核心。

Spring Cloud:提供了微服务的一整套解决方案:服务发现注册、配置核心、音讯总线、负载平衡、断路器、数据监控等

  1. 架构的残缺度: Dubbo只是实现了服务治理;Spring Cloud上面有17个子我的项目(可能还会新增)别离笼罩了微服务架构下的方方面面,服务治理只是其中的一个方面;肯定水平来说,Dubbo只是Spring Cloud Netflix中的一个子集。
  2. 服务依赖形式: 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-serverspringcloud-memberspringcloud-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: 8100eureka:  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@SpringBootApplicationpublic 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: 8000spring:  application:    ##服务别名--服务注册到Eureka名称 name: app-membereureka:  client:    service-url:      ##以后服务注册到Eureka服务地址 defaultZone: http://localhost:8100/eureka    register-with-eureka: true ## 须要检索服务信息 fetch-registry: true

application-prod.yml配置文件:

##服务端口号server:  port: 8010spring:  application:    ##服务别名--服务注册到Eureka名称 name: app-membereureka:  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 */@RestControllerpublic 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@SpringBootApplicationpublic 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: 8200spring:  application:    ##服务别名--服务注册到Eureka名称 name: app-ordereureka:  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 */@RestControllerpublic 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@EnableEurekaClientpublic 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包的形式
  1. 找到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/infohttp://dy-202006281547:8000/getMember即可拜访member服务

启动 order服务:

启动AppOrder.java

并拜访http://localhost:8100/,能够看到注册了别名为 APP-ORDER的服务

测试

Postman 拜访localhost:8084/orderToMember

屡次提交可发现做了负载平衡。

总结

springcloud集成Eureka还是很简略,应用注解就完事了!