摘自 Spring Cloud官网
Spring Cloud provides tools for developers to quickly build some of the common patterns in distributed systems (e.g. configuration management, service discovery, circuit breakers, intelligent routing, micro-proxy, control bus, one-time tokens, global locks, leadership election, distributed sessions, cluster state). Coordination of distributed systems leads to boiler plate patterns, and using Spring Cloud developers can quickly stand up services and applications that implement those patterns. They will work well in any distributed environment, including the developer’s own laptop, bare metal data centres, and managed platforms such as Cloud Foundry.
以上翻译如下:
Spring Cloud 为开发者提供了工具来快速构建分布式系统中的一些常见模式(例如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话,集群状态)。分布式系统的协调导致了样板模式,使用 Spring Cloud 开发人员可以快速建立实现这些模式的服务和应用程序。它们在任何分布式环境中都能很好地工作,包括开发人员自己的笔记本电脑、裸机数据中心以及 Cloud Foundry 等托管平台。
大致意思就是 Spring Cloud 是一个分布式框架 , 基于Spring Boot 微服务, 将一个一个独立的模块聚合 ,达到了“ 高内聚 · 低耦合
”
Spring Cloud采用HTTP的 REST 方式调用服务,Dubbo采用RPC 框架实现远程调用服务
Dubbo 活跃度较低
Spring Cloud 社区活跃度比较高
定位不同:Dubbo 的定位是一款 高性能RPC框架 ,而 Spring Cloud的目标是分布式微服务架构的一站式解决方案
框架 |
Spring Cloud |
Dubbo |
服务注册中心 |
Spring Cloud Netfix Eureka |
Zookkeper |
服务调用方式 |
REST API |
RPC |
服务监控 |
Spring Boot Admin |
Dubbo-monitor |
断路器 |
Spring Cloud Netfix Hystrix |
未完善,引用外部断路器 |
服务网关 |
Spring Cloud Netfix Zuul |
无 |
分布式配置 |
Spring Cloud Config |
无 |
服务跟踪 |
Spring Cloud Sleuth |
无 |
消息总栈 |
Spring Cloud Bus |
无 |
数据流 |
Spring Cloud Strem |
无 |
批量任务 |
Spring Cloud Task |
无 |
两者最大的区别: Spring Cloud 抛弃了 Dubbo 的 RPC,采用了基于 HTTP 的 REST方式
严格来说,这两种方式各有优劣。虽然从一定程度上来说,后者牺牲了服务调用的性能,但也避免了上面提到的原生RPC带来的问题。而且REST相比RPC更为灵活,服务提供方和调用方的依赖只依靠一纸契约,不存在代码级别的强依赖,这个优点在当下强调快速演化的微服务环境下,显得更加合适。
Netflix在涉及Eureka时,遵循的就是API原则.
Eureka是 Netflix 的 子模块 ,也是 核心模块之一 。Eureka是 基于REST 的服务,用于 定位服务 ,以 实现云端中间件层服务发现和故障转移 ,服务注册与发现对于微服务来说是非常重要的,有了服务注册与发现,只需要使用服务的标识符,就可以访问到服务,而不需要修改服务调用的配置文件了,功能类似于Dubbo的注册中心,比如Zookeeper。
Eureka两大组件:Eureka Server(提供注册服务)、 Eureka Client(JAVA客户端,负责发送心跳)
Eureka三大角色:
基于Spring Boot聚合工程
使用Spring Cloud 实现分布式应用
流程图
模块说明
pom.xml
4.0.0 org.example spring_cloud 1.0-SNAPSHOT springcloud-api springcloud-provider springcloud-eureka springcloud-consumer pom UTF-8 1.8 1.8 4.12 1.2.17 1.16.18 org.springframework.cloud spring-cloud-alibaba-dependencies 0.2.0.RELEASE pom import org.springframework.cloud spring-cloud-dependencies Greenwich.SR1 pom import org.springframework.boot spring-boot-dependencies 2.1.4.RELEASE pom import mysql mysql-connector-java 5.1.47 com.alibaba druid 1.1.10 org.mybatis.spring.boot mybatis-spring-boot-starter 1.3.2 ch.qos.logback logback-core 1.2.3 junit junit ${junit.version} log4j log4j ${log4j.version} org.projectlombok lombok ${lombok.version}
pom.xml
spring_cloud org.example 1.0-SNAPSHOT 4.0.0 springcloud-api 8 8 org.projectlombok lombok
Dept实体类
package com.wanshi.springcloud.entity; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; @Data @NoArgsConstructor //支持链式编程 @Accessors(chain = true) public class Dept { private Integer dept_noid; private String dept_name; private String db_source; }
pom.xml
spring_cloud org.example 1.0-SNAPSHOT 4.0.0 springcloud-eureka org.springframework.cloud spring-cloud-starter-eureka-server 1.4.6.RELEASE org.springframework.boot spring-boot-devtools
application.yml
server: port: 7001 # eureka 配置 eureka: instance: hostname: localhost # eureka 服务端的实例名称 client: register-with-eureka: false # 是否向 eureka 注册自己,不注册自己 fetch-registry: false # fetch-registry 如果为false,表示自己为注册中心 service-url: # 将默认的url去掉,替换为自己的,监控页面 defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
启动类
package com.wanshi.springcloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; @SpringBootApplication // EnableEurekaServer 启动Eureka服务 @EnableEurekaServer public class EurekaServerMainApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerMainApplication.class, args); } }
pom.xml
org.springframework.cloud spring-cloud-starter-eureka 1.4.6.RELEASE org.springframework.boot spring-boot-starter-actuator org.example springcloud-api 1.0-SNAPSHOT junit junit test mysql mysql-connector-java com.alibaba druid ch.qos.logback logback-core org.mybatis.spring.boot mybatis-spring-boot-starter org.springframework.boot spring-boot-test org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-jetty org.springframework.boot spring-boot-devtools org.springframework.boot spring-boot-starter-jdbc
application.yml
server: port: 8001 servlet: context-path: /springcloud-provider-dept/ spring: application: name: SpringCloudProviderDept datasource: url: jdbc:mysql://localhost:3306/db_spring_cloud01 username: root password: 111111 driver-class-name: com.mysql.jdbc.Driver # Eureka的配置,服务注册到那里 eureka: client: service-url: defaultZone: http://localhost:7001/eureka/ instance: instance-id: springcloud-provider-dept8001 # 修改 Eureka上的默认描述信息 info: app.name: wanshi-springcloud company.name: blog.wanshi.com
DeptController
package com.wanshi.springcloud.controller; import com.wanshi.springcloud.entity.Dept; import com.wanshi.springcloud.service.DeptService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.web.bind.annotation.*; import java.util.List; @RestController @RequestMapping("/dept/") public class DeptController { @Autowired private DeptService deptService; @GetMapping("list") public Listlist() { return deptService.list(); } @PostMapping("insert") public Integer insert(@RequestBody Dept param) { return deptService.insert(param); } @PostMapping("get/{id}") public Dept get(@PathVariable("id") Integer id) { Dept param = new Dept(); param.setDept_noid(id); return deptService.get(param); } }
pom.xml
org.springframework.cloud spring-cloud-starter-ribbon 1.4.6.RELEASE org.springframework.cloud spring-cloud-starter-eureka 1.4.6.RELEASE org.example springcloud-api 1.0-SNAPSHOT org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-devtools
application.yml
server: port: 80 # Eureka配置 eureka: client: register-with-eureka: false # 不向注册中心注册自己 service-url: defaultZone: http://localhost:7001/eureka/
ConfigBean配置
package com.wanshi.springcloud.config; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; @Configuration public class ConfigBean { @Bean public RestTemplate getRestTemplate() { return new RestTemplate(); } }
DeptConsumerController
package com.wanshi.springcloud.controller; import com.wanshi.springcloud.entity.Dept; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.client.RestTemplate; import java.util.List; @RestController @CrossOrigin @RequestMapping("/consumer/dept/") public class DeptConsumerController { @Autowired private RestTemplate restTemplate; private static final String REST_URL_PREFIX = "http://localhost:8001/springcloud-provider-dept"; @GetMapping("get/{id}") public Integer get(@PathVariable("id") Integer id) { return restTemplate.getForObject(REST_URL_PREFIX + "/dept/get/" + id, Integer.class); } @GetMapping("list") public Listlist() { return restTemplate.getForObject(REST_URL_PREFIX + "/dept/list", List.class); } @PostMapping("insert") public Integer insert(@RequestBody Dept param) { return restTemplate.patchForObject(REST_URL_PREFIX + "/dept/insert", param, Integer.class); } }
启动类
package com.wanshi.springcloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; // Ribbon 和 Eureka 整合以后,客户端可以直接调用,不用关心IP地址和端口号 @SpringBootApplication @EnableEurekaClient public class DeptConsumerApplication { public static void main(String[] args) { SpringApplication.run(DeptConsumerApplication.class, args); } }
以上就是【 小王 Java 】对 Spring Cloud 搭建Eureka注册中心 实现服务者与消费者的服务调用 简单的概述,理解代码不难,多多练习,该工程是一个分布式应用框架,注册了Eureka注册中心作为服务的中转站,可以多多练习去巩固自己的技术~