1.1 spring boot简介:
Spring cloud 基于spring boot 去构建, 所以先介绍下 spring boot.
Spring框架功能很强大,但是就算是一个很简单的项目,我们也要配置很多东西。因此就有了SpringBoot框架,它的作用很简单,就是帮我们自动配置。SpringBoot框架的核心就是自动配置,只要存在相应的jar包,Spring就帮我们自动配置。如果默认配置不能满足需求,我们还可以替换掉自动配置类,使用我们自己的配置。另外,SpringBoot还集成了嵌入式的Web服务器,系统监控等很多有用的功,让我们快速构建企业及应用程序
1.2:使用boot cli 快速搭建个项目
配置环境变量
可以用spring –version检验是否安装成功
随后编写app.groovy文件就可以创建一个简单的boot应用了
最后打开localhost:8080 就可以看到效果了
2: spring cloud 简介
Spring Cloud是一个基于Spring Boot实现的云应用开发工具,详细官方文档:中文: :https://springcloud.cc/ 英文: https://spring.io/docs/reference
本文档微服务基于上图的架构。首先, 搭建两个Eureka 服务注册中心,实现注册中心的高可用. 搭建三个微服务,其中有两个是一样的,只是端口不同,实现微服务的高可用。Feign 声明式服务调用属于服务消费者, 可以基于服务名去实现服务调用,并且自带客户端负载均衡. Zuul是API网关服务, 类似于面向对象设计模式中的façade模式,它的存在就像微服务架构系统的门面一样,所有的外部客户端访问都需要经过它来进行调度和过滤.
2.1先介绍Eureka
服务注册中心:Eureka是Netflix开源的一款提供服务注册和发现的产品,它提供了完整的ServiceRegistry和ServiceDiscovery实现。也是springcloud体系中最重要最核心的组件之一。
有了服务中心调用关系会有什么变化,画几个简图来帮忙理解
项目A调用项目B
正常调用项目A请求项目B
有了服务中心之后,任何一个服务都不能直接去掉用,都需要通过服务中心来调用
2.2: 搭建eureka:
通过spring cloud,我们只需要很简单的几个步骤就可以完成。
2.2.1pom中添加依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
2.2.2、添加启动代码中添加@EnableEurekaServer
注解
@SpringBootApplication
@EnableEurekaServer
publicclassSpringCloudEurekaApplication{
publicstaticvoidmain(String[]args){
SpringApplication.run(SpringCloudEurekaApplication.class,args);
}
}
2.2.3、配置文件:application.yml
spring:
application:
name: spring-cloud-eureka
profiles: peer1
server:
port: 8000
eureka:
instance:
hostname: peer1
client:
serviceUrl:
defaultZone:http://peer2:8001/eureka/
—
spring:
application:
name: spring-cloud-eureka
profiles: peer2
server:
port: 8001
eureka:
instance:
hostname: peer2
client:
serviceUrl:
defaultZone:http://peer1:8000/eureka/
eureka.client.serviceUrl.defaultZone:设置与Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址。多个地址可使用 , 分隔。
2.2.4 host转换
在hosts文件中加入如下配置:
127.0.0.1 peer1
127.0.0.1 peer2
2.2.5打包启动
mvn clean package
# 分别以peer1和peeer2 配置信息启动eureka
java -jarspring-cloud-eureka-0.0.1-SNAPSHOT.jar –spring.profiles.active=peer1
java -jarspring-cloud-eureka-0.0.1-SNAPSHOT.jar –spring.profiles.active=peer2
这样,访问localhost:8000, 或者localhost:8001 ,就可以看到有两个Eureka Server了,实现了注册中心的高可用。
2.3. 服务提供者
这里我们使用boot集成mybatis, 数据库采用mysql
2.3.1 : pom文件:
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
<!–数据库数据源相关配置 –>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.21</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
2.3.2: 配置文件配置:
包括数据库信息,mybatis的配置文件,eruka client 配置等
spring:
application:
name: spring-cloud-emp
datasource:
url: jdbc:mysql://localhost:3306/test
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
devtools:
restart:
exclude: static/**,public/**
main:
banner-mode: “off”
mybatis:
mapperLocations: classpath:/**/*Mapper.xml
server:
port: 8081
eureka:
client:
serviceUrl:
defaultZone: http://peer1:8000/eureka
2.3.3 服务代码编写:
主要提供 emp表数据 查看, 根据id删除一条记录。本部分只展示部门主要代码
@RestController
public class EmpController {
@Autowired
private IEmpServiceservice;
@RequestMapping(“/emplist”)
public List<Emp>empList(){
List<Emp> empList = service.selectAll();
return empList;
}
@RequestMapping(“/deleteEmp”)
public Stringdelete(@RequestParam int id){
int a = service.deleteById(id);
if(a==1){
return “deletesuccess in server 1”;
}else{
return “nosuch person responsed by server 1″;
}
}
}
至此,server 1 搭建完毕
2.3.4: 克隆一份相同的服务:
1.改变端口:
2. 代码区分:
随后分别启动这两个服务并访问:
至此,完成两个微服务的搭建
2.3.5: html页面的编写与访问:
1. 额外为server1服务添加html页面的展示
集成下freemarker,需要在pom中引入
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
就可以了
2. 代码编写
Controller层
View层
3. 访问查看
2.4:Feign消费者
2.4.1Ribbon
Feign 的客户端负载均衡是通过Ribbon 实现的,我们先了解下Ribbon。Ribbon是一个基于HTTP和TCP客户端的负载均衡器,它基于Netflix Ribbon实现, 客户端负载均衡与服务端负载均衡最大的不通电在于服务清单所存储的位置,在客户端负载均衡中,所有的清单都维护在服务注册中心上面.
2.4.2 Feign 声明式服务调用
1. pom 文件
· <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
2. 启动类加上@ EnableFeignClients注解
3编写service接口
添加注解, name 与 服务提供者名字一致。 方法返回值,方法名,参数,requestMapping需要和服务类保持一致,
4. 编写controller 类
实现客户端调用 服务端
5.通过Feign 消费者轮询访问服务
第一次访问是server2 提供的服务
再次访问是server1提供的服务, 可以看到Feign为我们实现了客户端负载均衡
PS: Feign 不能处理服务的非REST请求,会报nosuitable HttpMessageConverter found,所以server1页面访问是不会成功的,但是zuul是可以请求到页面的.如下图:
2.4.5: 熔断机制
在微服务架构中通常会有多个服务层调用,基础服务的故障可能会导致级联故障,进而造成整个系统不可用的情况,这种现象被称为服务雪崩效应。服务雪崩效应是一种因“服务提供者”的不可用导致“服务消费者”的不可用,并将不可用逐渐放大的过程。
在Spring Feign中使用了Hystrix 来实现断路器的功能。Hystrix是Netflix开源的微服务框架套件之一,该框架目标在于通过控制那些访问远程系统、服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。Hystrix具备拥有回退机制和断路器功能的线程和信号隔离,请求缓存和请求打包,以及监控和配置等功能。
1.创建EmpServiceFallback类实现EmpService接口的方法
2.在EmpService接口上添加fallback属性
3.关掉服务,测试熔断是否出发
发现熔断触发,如下图:
2.5 zuul api网关
在微服务架构中,后端服务往往不直接开放给调用端,而是通过一个API网关根据请求的url,路由到相应的服务。当添加API网关后,在第三方调用端和服务提供方之间就创建了一面墙,这面墙直接与调用方通信进行权限控制,后将请求均衡分发给后台服务端
2.5.1 pom文件
· <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
2.5.2:启动类加上注解
2.5.3 配置转发规则
2.5.4 访问测试
网关的默认路由规则: 如果后端服务多达十几个的时候,每一个都这样配置也挺麻烦的,springcloud zuul已经帮我们做了默认配置。默认情况下,Zuul会代理所有注册到EurekaServer的微服务,并且Zuul的路由规则如下:http://ZUUL_HOST:ZUUL_PORT/微服务在Eureka上的serviceId/**会被转发到serviceId对应的微服务。我们注释掉gateway-service-zuul-eureka项目中关于路由的配置:
重新启动后,访问:测试返回结果和上述示例相同,说明spirng cloud zuul默认已经提供了转发功能。并且可以访问到server1的页面到此zuul的基本使用我们就介绍完了
3.附件:
依次打开eruka , service provider, service provider2, feign-consumer,zuul
今天的文章SpringCloud搭建分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/10363.html