1.Spring Cloud简介
Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。
2.基本的服务者与消费者及调用关系

1 import org.springframework.context.annotation.Bean; 2 import org.springframework.context.annotation.Configuration; 3 import org.springframework.web.client.RestTemplate; 4 5 /** 6 * SpringCloud相关配置 7 * @author Administrator 8 * 9 */ 10 @Configuration 11 public class SpringCloudConfig { 12 13 /** 14 * 调用服务模版 15 * @return 16 */ 17 @Bean 18 public RestTemplate getRestTemplate(){ 19 return new RestTemplate(); 20 } 21 }
主要是定义一个bean RestTemplate对象; springcloud消费者,服务提供者之间的交互是http rest方式,比dubbo rpc方式更加灵活方便点;
StudentConsumerController类:

1 /** 2 * 3 * @author Administrator 4 * 5 */ 6 @RestController 7 @RequestMapping("/student") 8 public class StudentConsumerController { 9 10 @Resource 11 private RestTemplate restTemplate; 12 13 /** 14 * 添加或者修改学生信息 15 * @param student 16 * @return 17 */ 18 @PostMapping(value="/save") 19 private boolean save(Student student){ 20 return restTemplate.postForObject("http://localhost:1001/student/save", student, Boolean.class); 21 } 22 23 /** 24 * 查询学生信息 25 * @return 26 */ 27 @SuppressWarnings("unchecked") 28 @GetMapping(value="/list") 29 public List<Student> list(){ 30 return restTemplate.getForObject("http://localhost:1001/student/list", List.class); 31 } 32 33 /** 34 * 根据id查询学生信息 35 * @return 36 */ 37 @GetMapping(value="/get/{id}") 38 public Student get(@PathVariable("id") Integer id){ 39 return restTemplate.getForObject("http://localhost:1001/student/get/"+id, Student.class); 40 } 41 42 /** 43 * 根据id删除学生信息 44 * @return 45 */ 46 @GetMapping(value="/delete/{id}") 47 public boolean delete(@PathVariable("id") Integer id){ 48 try{ 49 restTemplate.getForObject("http://localhost:1001/student/delete/"+id, Boolean.class); 50 return true; 51 }catch(Exception e){ 52 return false; 53 } 54 } 55 }
再搞一个启动类StudentConsumerApplication_80:

1 @SpringBootApplication(exclude={DataSourceAutoConfiguration.class,HibernateJpaAutoConfiguration.class}) 2 public class StudentConsumerApplication_80 { 3 4 public static void main(String[] args) { 5 SpringApplication.run(StudentConsumerApplication_80.class,args); 6 } 7 }
这里的话 加了特殊配置 排除了 数据源注入(@SpringBootApplication
(exclude={DataSourceAutoConfiguration.
class
,HibernateJpaAutoConfiguration.
class
})
),
不加的话 会报错,老版本没有这个问题;
3.服务注册与发现组件Eureka
服务注册与发现组件Eureka
Eureka github 地址: https://github.com/Netflix/eureka
Eureka简介:
Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能。
Eureka包含两个组件:Eureka Server和Eureka Client。
Eureka Server提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。
Eureka Client是一个java客户端,用于简化与Eureka Server的交互,客户端同时也就别一个内置的、使用轮询(round-robin)负载算法的负载均衡器。
在应用启动后,将会向Eureka Server发送心跳,默认周期为30秒,如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Server将会从服务注册表中把这个服务节点移除(默认90秒)。
Eureka Server之间通过复制的方式完成数据的同步,Eureka还提供了客户端缓存机制,即使所有的Eureka Server都挂掉,客户端依然可以利用缓存中的信息消费其他服务的API。
综上,Eureka通过心跳检查、客户端缓存等机制,确保了系统的高可用性、灵活性和可伸缩性。
类似zookeeper,Eureka也是一个服务注册和发现组件,是SpringCloud的一个优秀子项目,不过比较坑的是,Eureka2版本已经停止更新了。但是Eureka1版本还是很稳定,功能足够用,所以还是有必要学习下。
但是这里有几个常用的服务注册与发现组件比对;
服务注册与发现原理。
4.搭建Eureka服务注册中心
搭建Eureka服务注册中心
前面说过eureka是c/s模式的 server服务端就是服务注册中心,其他的都是client客户端,服务端用来管理所有服务,客户端通过注册中心,来调用具体的服务;
我们先来搭建下服务端,也就是服务注册中心;
新建 module microservice-eureka-server-2001
application.yml配置:

1 server: 2 port: 2001 3 context-path: / 4 5 eureka: 6 instance: 7 hostname: localhost #eureka注册中心实例名称 8 client: 9 register-with-eureka: false #false 由于该应用为注册中心,所以设置为false,代表不向注册中心注册自己。 10 fetch-registry: false #false 由于注册中心的职责就是维护服务实例,它并不需要去检索服务,所以也设置为false 11 service-url: 12 defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #设置与Eureka注册中心交互的地址,查询服务和注册服务用到
启动类:

1 @SpringBootApplication 2 @EnableEurekaServer 3 public class EurekaApplication_2001 { 4 5 public static void main(String[] args) { 6 SpringApplication.run(EurekaApplication_2001.class, args); 7 } 8 }
主要是要加入下@EnableEurekaServer
5.Eureka注册中心高可用集群配置
Eureka高可用集群配置
当注册中心扛不住高并发的时候,这时候 要用集群来扛;
我们再新建两个module microservice-eureka-server-2002 microservice-eureka-server-2003
第一步:
修改三个项目(eureka)的application.yml文件,主要是修改 hostname和defaultZone,
2001修改(其他2002、2003修改方式一样,这里只列举2001):
server:
port: 2001
context-path: /
eureka:
instance:
# 单机 hostname: localhost #eureka注册中心实例名称
hostname: eureka2001.wfd.com # 集群
client:
register-with-eureka: false #false 由于该应用为注册中心,所以设置为false,代表不向注册中心注册自己。
fetch-registry: false #false 由于注册中心的职责就是维护服务实例,它并不需要去检索服务,所以也设置为false
service-url:
defaultZone: http://eureka2002.wfd.com:2002/eureka/,http://eureka2003.wfd.com:2003/eureka/ # 集群
#单机defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #设置与Eureka注册中心交互的地址,查询服务和注册服务用到
第二步:
修改服务提供者项目的application.yml,主要修改eureka.client.service-url.defaultZone
eureka:
instance:
hostname: localhost #eureka客户端主机实例名称
appname: microservice-student #客户端服务名
instance-id: microservice-student:1001 #客户端实例名称
prefer-ip-address: true #显示IP
client:
service-url:
# 单机 defaultZone: http://localhost:2001/eureka #把服务注册到eureka注册中心
defaultZone: http://eureka2001.wfd.com:2001/eureka/,http://eureka2002.wfd.com:2002/eureka/,http://eureka2003.wfd.com:2003/eureka/ # 集群
访问。。。。
注:这里本质是三个服务注册中心都有我们服务提供者的信息,等后面讲到服务发现和服务调用,我们通过一些策略(默认轮询),会去找对应的服务注册中心;通过集群,能减轻每个服务注册中心的压力;