Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中涉及的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等操作提供了一种简单的开发方式。
Spring Cloud简介
Spring Cloud包含了多个子项目(针对分布式系统中涉及的多个不同开源产品),比如:Spring Cloud Config、Spring Cloud Netflix、Spring Cloud0 CloudFoundry、Spring Cloud AWS、Spring Cloud Security、Spring Cloud Commons、Spring Cloud Zookeeper、Spring Cloud CLI等项目。
微服务架构
微服务(Microservices Architecture)是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成。系统中的各个微服务可被独立部署,各个微服务之间是松耦合的。每个微服务仅关注于完成一件任务并很好地完成该任务。在所有情况下,每个任务代表着一个小的业务能力。
微服务架构(Microservices Architecture)
微服务架构的核心思想是,一个应用是由多个小的、相互独立的、微服务组成,这些服务运行在自己的进程中,开发和发布都没有依赖。不同服务通过一些轻量级交互机制来通信,例如 RPC、HTTP 等,服务可独立扩展伸缩,每个服务定义了明确的边界,不同的服务甚至可以采用不同的编程语言来实现,由独立的团队来维护。简单的来说,一个系统的不同模块转变成不同的服务!而且服务可以使用不同的技术加以实现!
微服务设计
那我们在微服务中应该怎样设计呢。以下是微服务的设计指南:
1:职责单一原则(Single Responsibility Principle):把某一个微服务的功能聚焦在特定业务或者有限的范围内会有助于敏捷开发和服务的发布。
2:设计阶段就需要把业务范围进行界定。
3:需要关心微服务的业务范围,而不是服务的数量和规模尽量小。数量和规模需要依照业务功能而定。
4:于SOA不同,某个微服务的功能、操作和消息协议尽量简单。
5:项目初期把服务的范围制定相对宽泛,随着深入,进一步重构服务,细分微服务是个很好的做法。
关于微服务架构的取舍
1:在合适的项目,合适的团队,采用微服务架构收益会大于成本。
2:微服务架构有很多吸引人的地方,但在拥抱微服务之前,也需要认清它所带来的挑战。
3:需要避免为了“微服务”而“微服务”。
4:微服务架构引入策略 – 对传统企业而言,开始时可以考虑引入部分合适的微服务架构原则对已有系统进行改造或新建微服务应用,逐步探索及积累微服务架构经验,而非全盘实施微服务架构。
服务治理
由于Spring Cloud为服务治理做了一层抽象接口,所以在Spring Cloud应用中可以支持多种不同的服务治理框架,比如:Netflix Eureka、Consul、Zookeeper。在Spring Cloud服务治理抽象层的作用下,我们可以无缝地切换服务治理实现,并且不影响任何其他的服务注册、服务发现、服务调用等逻辑。
Eureka Server
提供服务注册和发现
项目搭建
环境:
系统:win10
数据:mysql5.7,mongodb,hbase三个数据都需要
编辑工具:IDEA
jdk:1.8
mavne:3.5
创建项目:
File---->new---->Prject---->Spring Initializr(没有的话去设置里面添加查询)
项目创建到此结束!
开启服务注册
package com.yyburst.eureka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
添加配置
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:${server.port}/eureka/
register-with-eureka: false
server:
enable-self-preservation: false
instance:
leaseRenewalIntervalInSeconds: 1
leaseExpirationDurationInSeconds: 2
spring:
application:
name: eureka
server:
port: 8761
访问服务
启动工程后,访问:http://localhost:8761/
Service Provider
服务提供方
将自身服务注册到 Eureka 注册中心,从而使服务消费方能够找到
创建项目
和创建Eureka一样
开启服务注册
package com.yyburst.product;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class ServerApplication {
public static void main(String[] args) {
SpringApplication.run(ServerApplication.class, args);
}
}
添加配置
需要配置才能找到Eureka服务器。
数据连接+rabbitmq+端口自定义完整配置如下:
spring:
application:
name: product
rabbitmq:
host: 192.168.1.13
port: 5672
username: guest
password: guest
management:
security:
enabled: false
datasource:
driver-class-name: com.mysql.jdbc.Driver
username: root
password: 123456
url: jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf-8&allowMultiQueries=true
jpa:
show-sql: true
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
server:
port: ${random.int(8000,9000)}
其中defaultZone是一个魔术字符串后备值,为任何不表示首选项的客户端提供服务URL(即它是有用的默认值)。
通过spring.application.name属性,我们可以指定微服务的名称后续在调用的时候只需要使用该名称就可以进行服务的访问
访问服务
启动该工程后,再次访问启动工程后:http://localhost:8761/
可以如下图内容,我们定义的服务被成功注册了。