1.1 什么是微服务?
微服务就是把原本臃肿的一个项目的所有模块拆分开来并做到互相没有关联,甚至可以不使用同一个数据库。 比 如:项目里面有User模块和Power模块,但是User模块和Power模块并没有直接关系,仅仅只是一些数据需要交 互,那么就可以吧这2个模块单独分开来,当user需要调用power的时候,power是一个服务方,但是power需要 调用user的时候,user又是服务方了, 所以,他们并不在乎谁是服务方谁是调用方,他们都是2个独立的服务,这 时候,微服务的概念就出来了。
1.2 经典问题:微服务和分布式的区别
谈到区别,我们先简单说一下分布式是什么,所谓分布式,就是将偌大的系统划分为多个模块(这一点和微服务很 像)部署到不同机器上(因为一台机器可能承受不了这么大的压力或者说一台非常好的服务器的成本可能够好几台 普通的了),各个模块通过接口进行数据交互,其实 分布式也是一种微服务。 因为都是吧模块拆分开来变为独立 的单元,提供接口来调用,那么 他们本质的区别在哪呢? 他们的区别主要体现在“目标”上, 何为目标,就是你这 样架构项目要做到的事情。 分布式的目标是什么? 我们刚刚也看见了, 就是一台机器承受不了的,或者是成本问 题 , 不得不使用多台机器来完成服务的部署, 而微服务的目标 只是让各个模块拆分开来,不会被互相影响,比如 模块的升级亦或是出现BUG等等...
讲了这么多,可以用一句话来理解:分布式也是微服务的一种,而微服务他可以是在一台机器上。
1.2 Spring Cloud简介
Spring Cloud为开发人员提供了快速构建分布式系统中的一些常见模式的工具(例如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导层选举、分布式会话、集群状态)。分布式系统的协调导致了锅炉板模式,使用Spring Cloud开发人员可以快速建立实现这些模式的服务和应用程序。它们在任何分布式环境中都能很好地工作,包括开发人员自己的笔记本电脑、裸机数据中心和云计算等托管平台。
1.3 微服务与Spring-Cloud的关系(区别)
微服务只是一种项目的架构方式,或者说是一种概念,就如同我们的MVC架构一样, 那么Spring-Cloud便是对这 种技术的实现。
1.4 微服务一定要使用Spring-Cloud吗?
微服务只是一种项目的架构方式,如果你足够了解微服务是什么概念你就会知道,其实微服务就算 不借助任何技术也能实现,只是有很多问题需要我们解决罢了例如:负载均衡,服务的注册与发现,服务调用,路 由等等一系列问题。所以Spring-Cloud 就出来了,Spring-Cloud将处理这些问题的的技术全部打包 好了,就类似那种开箱即用的感觉。微服务的开发框架很多,你也可以选择阿里巴巴的Dubbo框架开发微服务,只不过Dubbo是一个重型的微服务治理框架,在Spring Cloud火起来之前,国内很多公司大都是选择Dubbo框架开发微服务的。
2 Spring Cloud Netflix 模块介绍
2.1服务注册中心
Spring Cloud Netflix通过自动配置和绑定到Spring环境和其他Spring编程模型习惯用法,为Spring引导应用程序提供了Netflix OSS集成。通过一些简单的注释,您可以快速启用和配置应用程序中的常见模式,并使用经过实战测试的Netflix组件构建大型分布式系统。提供的模式包括服务发现(Eureka)、断路器(Hystrix)、智能路由(Zuul)和客户端负载平衡(Ribbon)。
在Spring Cloud微服务开发框架中,可以提供注册中心的提供注册中心的有3个子模块,分别是Spring Cloud Netflix提供的Eureka注册中心、Spring Cloud Consul提供的Consul注册中心和Spring Cloud Zookeeper提供的Zookeeper注册中心。这里主要介绍Spring Cloud Netflix模块中的Eureka Server和Eureka Client实战,后面有时间会上Spring Cloud Consul和Spring Cloud Zookeeper的实战代码,并比较它们之间的优缺点。
2.2 Eureka 注册中心
2 Spring Cloud 项目搭建
因为spring-cloud是基于spring-boot项目来的,所以我们项目得是一个spring-boot项目,至于spring-boot项目, 这篇博客不作讨论,这里要注意的一个点是spring-cloud的版本与spring-boot的版本要对应下图:
本人使用的是Spring Boot 2.0.2版本和Spring Cloud Finchly SR2版本,最新版本的Spring Boot已经到了2.16版本,Spring Cloud也到了Greenwich SR2版本。但是本人在家里搭建Eureka 服务端和客户端时发现采用Spring Boot 2.1.6版本和Spring Cloud Greenwich SR2版本时在项目启动时总是报了各种难以解决的异常(本人在公司搭建的ureka 服务端和客户端项目时发现采用Spring Boot 2.1.6版本和Spring Cloud Greenwich SR2版本项目启动时却没问题,自己也找不到具体原因 ),于是参考了鲁班学院商鞅老师之前的笔记并结合Spring Cloud官方文档采用了Spring Boot 2.0.2版本和Spring Cloud Finchly SR2版本才解决了项目启动时报错的Bug。废话不多说,下面直接上代码。
说明:本项目是在本人之前的一个2.1.4版本的Spring Boot聚合项目基础之上修改构建的
1) 使用IDEA 工具新建一个Maven项目,项目名称为spring-boot-samples, 然后新建2个子模块Spring Boot项目,分别是cloud-eureka-server1和cloud-eureka-client1 项目,并修改它们的Pom依赖
父项目的pom文件内容如下:
4.0.0
pom
cloud-eureka-server1
cloud-eureka-client1
org.springframework.boot
spring-boot-starter-parent
2.0.2.RELEASE
com.hsf
spring-boot-samples
0.0.1-SNAPSHOT
spring-boot-samples
Demo project for Spring Boot
1.8
Finchley.SR2
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
javax.servlet
javax.servlet-api
3.1.0
provided
com.zaxxer
HikariCP
3.3.1
org.springframework.boot
spring-boot-starter-data-jpa
org.springframework.boot
spring-boot-starter-json
org.springframework.cloud
spring-cloud-dependencies
${spring-cloud.version}
org.apache.maven.plugins
maven-compiler-plugin
3.1
${java.version}
UTF-8
org.apache.maven.plugins
maven-surefire-plugin
true
cloud-eureka-server1的Pom内容如下
spring-boot-samples
com.hsf
0.0.1-SNAPSHOT
4.0.0
cloud-eureka-server1
0.0.1-SNAPSHOT
jar
spring-cloud-netflix-eureka-server cluster project demo
com.oracle
ojdbc6
11.2.0.3
org.springframework.cloud
spring-cloud-netflix-eureka-server
2.0.2.RELEASE
com.netflix.eureka
eureka-core
1.9.3
javax.servlet
servlet-api
org.springframework.boot
spring-boot-starter-freemarker
2.0.2.RELEASE
org.springframework.cloud
spring-cloud-starter-netflix-hystrix
2.0.1.RELEASE
${project.artifactId}
org.springframework.boot
spring-boot-maven-plugin
cloud-eureka-client1项目的pom内容如下
4.0.0
com.hsf
spring-boot-samples
0.0.1-SNAPSHOT
com.hsf
cloud-eureka-client1
0.0.1-SNAPSHOT
cloud-eureka-client1
Demo project for Spring Cloud Eureka Client
jar
1.8
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
2.0.2.RELEASE
com.sun.jersey
jersey-client
com.sun.jersey
jersey-core
com.sun.jersey.contribs
jersey-apache-client4
mysql
mysql-connector-java
runtime
${project.artifactId}
org.springframework.boot
spring-boot-maven-plugin
2) 配置文件和启动类
cloud-eureka-server1 项目的resources目录下新建两个yaml文件,分别是application.yaml和application-dev.yaml
application.yaml内容如下
eureka:
server:
enable-self-preservation: false #关闭自我保护机制
eviction-interval-timer-in-ms: 5000 #默认 60*1000 单位:毫秒
instance:
hostname: peer1
client:
fetchRegistry: false
serviceUrl:
defaultZone: http://peer1:8761/eureka/
registerWithEureka: false #禁用自己注册
spring:
profiles:
active: dev
application:
name: eurekaServer1
main:
allow-bean-definition-overriding: true
#必须配置freemark模板引擎参数,否则启动报错
freemarker:
template-loader-path: classpath:/templates/
prefer-file-system-access: false
application-dev.yaml 内容如下:
server:
port: 8761
address: 127.0.0.1
#eureka 服务端和客户端项目必须配置数据源,否则启动报错
spring:
datasource:
type: com.zaxxer.hikari.HikariDataSource
url: jdbc:oracle:thin:@localhost:1521:ORCL
driverClassName: oracle.jdbc.driver.OracleDriver
username: SYSTEM
password: mypassword
EurekaServer1Application启动类上加上@EnableEurekaServer注解
package com.hsf.cloudeurekaserver1;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class EurekaServer1Application {
public static void main(String[] args){
SpringApplication.run(EurekaServer1Application.class,args);
}
}
同样cloud-eureka-client1项目resources目录下新建application.yaml和application-dev.yaml文件
application.yaml
server:
port: 9090
connection-timeout: 30000s
servlet:
context-path: /eurekaClient
spring:
profiles:
active: dev
application:
name: eurekaClient
datasource:
type: com.zaxxer.hikari.HikariDataSource
driverClassName: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?useSSL=false
username: root
password: mypassword
jpa:
show-sql: true
hibernate:
ddl-auto: update
properties:
hibernate:
dialect: org.hibernate.dialect.MySQL57Dialect
logging:
level:
org:
hibernate:
SQL: debug
type:
descriptor:
sql: trace
application-dev.yaml
eureka:
client:
service-url:
defaultZone: http://peer1:8761/eureka/
instance:
hostname: localhost
instance-id: eurekaClient1 #实例注册到eureka服务器上的唯一实例ID
lease-renewal-interval-in-seconds: 30 #过多长时间发送心跳给eureka服务器,表明它仍然活着,默认为30s
prefer-ip-address: true #显示IP地址
在CloudEurekaClient1Application启动类上加上@EnableEurekaClient注解
package com.hsf.cloudeurekaclient1;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient
public class CloudEurekaClient1Application {
public static void main(String[] args) {
SpringApplication.run(CloudEurekaClient1Application.class, args);
}
}
然后在你的windows系统中C盘的 C:\Windows\System32\drivers\etc 目录下修改hosts文件内容,加入peer的域名解析
# localhost name resolution is handled within DNS itself.
127.0.0.1 localhost
::1 localhost
127.0.0.1 peer1
4. 启动Eureka服务端和客户端项目
依次选中EurekaServer1Application启动类和CloudEurekaClient1Application启动类的main函数,右键选中Debug模式启动
两个项目启动成功后,在谷歌浏览器中输入 http://peer:8761, 回车后看到下图效果,则证明我们的eureka server注册中心和eureka client客户端搭建成功了!这里我们能看见 名字叫eurekaclient的(图中将其大写了) id为eurekaClient1的服务 注册到我们的Eureka注册中心上面来了 。至此,一个简单的eureka已经搭建好了
参考链接
Spring Cloud Netflix官方文档开发指南: https://cloud.spring.io/spring-cloud-static/spring-cloud-netflix/2.2.0.M1/