springcloud学习笔记
Posted scanner小霸王
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springcloud学习笔记相关的知识,希望对你有一定的参考价值。
微服务是什么?
微服务化的核心就是将传统的一站式应用,根据业务拆分成一个一个的服务,彻底
地去耦合,每一个微服务提供单个业务功能的服务,一个服务做一件事,
从技术角度看就是一种小而独立的处理过程,类似进程概念,能够自行单独启动
或销毁,拥有自己独立的数据库。
SpringBoot和SpringCloud的关系与区别
1、SpringBoot只是一个快速开发框架,使用注解简化了xml配置,内置了Servlet容器,以Java应用程序进行执行。
2、SpringCloud是一系列框架的集合,可以包含SpringBoot。
SpringBoot是微服务框架吗?
1、SpringBoot只是一个快速开发框架,算不上微服务框架。
2、SpringCloud+SpringBoot 实现微服务开发。具体的来说是,SpringCloud具备微服务开发的核心技术:RPC远程调用技术;SpringBoot的web组件默认集成了SpringMVC,可以实现HTTP+JSON的轻量级传输,编写微服务接口,所以SpringCloud依赖SpringBoot框架实现微服务开发。
参考博客:
https://blog.csdn.net/weixin_42315600/article/details/84134094
微服务特点
1)拆分
2)各自独立的进程
3)拥有自己独立的数据库
微服务的优缺点
优点
每个服务足够内聚,足够小,代码容易理解这样能聚焦一个指定的业务功能或业务需求
开发简单、开发效率提高,一个服务可能就是专一的只干一件事。
微服务能够被小团队单独开发,这个小团队是2到5人的开发人员组成。
微服务是松耦合的,是有功能意义的服务,无论是在开发阶段或部署阶段都是独立的。
微服务能使用不同的语言开发。
易于和第三方集成,微服务允许容易且灵活的方式集成自动部署,通过持续集成工具,如Jenkins, Hudson, bamboo 。
微服务易于被一个开发人员理解,修改和维护,这样小团队能够更关注自己的工作成果。无需通过合作才能体现价值。
微服务允许你利用融合最新技术。
微服务只是业务逻辑的代码,不会和html,CSS 或其他界面组件混合。
每个微服务都有自己的存储能力,可以有自己的数据库。也可以有统一数据库。
缺点
开发人员要处理分布式系统的复杂性
多服务运维难度,随着服务的增加,运维的压力也在增大
系统部署依赖
服务间通信成本
数据一致性
系统集成测试
性能监控……
微服务案例构建过程需要注意的地方
消费者模块可以使用RestTemplate进行远程访问。
RestTemplate提供了多种便捷访问远程Http服务的方法,
是一种简单便捷的访问restful服务模板类,是Spring提供的用于访问Rest服务的客户端模板工具集。
RestTemplate访问restful接口接口非常简单
示例:
消费者
@RestController
public class DeptController_Consumer
{
private static final String REST_URL_PREFIX = "http://localhost:8001";
@Autowired
private RestTemplate restTemplate;
@RequestMapping(value="/consumer/dept/get/{id}")
public Dept get(@PathVariable("id") Long id)
{
return restTemplate.getForObject(REST_URL_PREFIX+"/dept/get/"+id, Dept.class);
}
@SuppressWarnings("unchecked")
@RequestMapping(value="/consumer/dept/list")
public List<Dept> list()
{
return restTemplate.getForObject(REST_URL_PREFIX+"/dept/list", List.class);
}
}
Eureka服务注册与发现
Eureka包含两个组件:Eureka Server 和 Eureka Client
各个节点启动后,会在Eureka Server注册
Eureka Client:简化Eureka Server交互
Netflix在设计Eureka时遵守的就是AP原则
Eureka相当于注册中心
注册中心eureka Server的构建
1)核心pom配置:
<dependencies>
<!--eureka-server服务端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
</dependencies>
- 核心yml配置:
server:
port: 7001
eureka:
instance:
hostname: localhost #eureka服务端的实例名称
client:
register-with-eureka: false #false表示不向注册中心注册自己。
fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。
3)主启动类加上服务端的注解@EnableEurekaServer,
接收其他微服务注册进来
服务提供者Provider的构建
Service Provider服务提供方将自身服务注册到Eureka,从而使服务消费方能够找到
1)核心pom配置:
<!-- 将微服务provider侧注册进eureka -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
2)核心yml配置:
eureka:
client: #客户端注册进eureka服务列表内
service-url:
defaultZone: http://localhost:7001/eureka
3)主启动类加上客户端的注解@EnableEurekaClient ,
服务启动后自动注册到eureka服务中
4)当客户端启动完成后,再次打开服务端的时候,将会发现已经注册进去的客户端
上面注册进去的MS-DEPT就是,客户端配置的spring.application.name
5)修改入驻服务的id
prefer-ip-address: true配置这一行,就会显示ip
actuator与注册微服务信息完善
1).微服务info内容详细信息
在provider的pom下增加:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2)在父工程的pom下增加:
作用:在src/main/resources路径下,用maven-resources-plugin解析带用$的字段
<build>
<finalName>microservicecloud</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<delimiters>
<delimit>$</delimit>
</delimiters>
</configuration>
</plugin>
</plugins>
</build>
在provider工程的yml下增加:
这是用于解析info的内容
info:
app.name: atguigu-microservicecloud
company.name: www.atguigu.com
build.artifactId: $project.artifactId$
build.version: $project.version$
3)点击提供者的超链接,显示详情信息
eureka自我保护
某时刻某一个微服务不可用了,eureka不会立刻清理,依旧会对该微服务的信息进行保存
禁用自我保护:
eureka.server.enable-self-preservation=false
provider服务发现Discovery示例
服务发现:可以对外暴露自身,从注册中心拿到相对应的服务
1).provider项目中的Controller层
@RestController
public class DeptController
{
@Autowired
private DeptService service;
@Autowired
private DiscoveryClient client;
@RequestMapping(value = "/dept/discovery", method = RequestMethod.GET)
public Object discovery()
{
List<String> list = client.getServices();
System.out.println("**********" + list);
List<ServiceInstance> srvList = client.getInstances("MICROSERVICECLOUD-DEPT");
for (ServiceInstance element : srvList) {
System.out.println(element.getServiceId() + "\\t" + element.getHost() + "\\t" + element.getPort() + "\\t"
+ element.getUri());
}
return this.client;
}
}
2).provider主启动类添加@EnableDiscoveryClient
3).consumer模块controller层调用
//测试@EnableDiscoveryClient,消费端可以调用服务发现
@RequestMapping(value="/consumer/dept/discovery")
public Object discovery()
{
return restTemplate.getForObject(REST_URL_PREFIX+"/dept/discovery", Object.class);
}
服务消费者Consumer的构建
Service Consumer服务消费方从Eureka获取注册服务列表,从而能够消费服务
Eureka集群配置
1).修改映射配置
示例:
找到C:\\Windows\\System32\\drivers\\etc路径下的hosts文件
2).服务端7001下的yml集群配置
eureka:
client: #客户端注册进eureka服务列表内
service-url:
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
客户端8001的集群配置修改
3)集群环境,7001上面挂着7002和7003
4).作为服务注册中心,Eureka比Zookeeper好在哪里
Zookeeper保证的是CP,
Eureka则是AP。
Eureka可以很好的应对因网络故障导致部分节点失去联系的情况,而不会像zookeeper那样使整个注册服务瘫痪。
因为是集群是分布在多台机器上,所以P一定要满足,
对于双11这种,选择A保证网站不能瘫痪
Ribbon负载均衡
Ribbon实现了一套客户端的 负载均衡的工具。
1)Ribbon的初步配置
消费者的pom.xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
修改消费者的yml
以及相对的controller的url修改
需要在restTemplate加上负载均衡的注解
消费者需要和eureka整合,加入EnableEurekaClient注解
2)Ribbon负载均衡算法
用我们重新选择的随机算法替代轮询算法
RetryRule:默认轮询,突然宕一个服务8001,8001会返回page 页面,撞了几次之后,将不会去找8001了
用我们自己的ribbin算法
自定义配置类,不能放在@ComponentScan注解所扫描的当前包以及子包下面,也就是不能和主启动类同包或者子包,因为@SpringBootApplication里面包含@ComponentScan
Feign负载均衡算法(也是客户端)
之前ribbin是根据服务名来进行访问,
而feign是通过接口+注解
feign集成了Ribbin,也可以用之前的负载均衡算法
前面是Ribbin+RestTemplate,是模板化的调用方法;
而Feign是声明式的Web服务客户端,只需要加上注解即可
1)Feign工程的配置
pom.xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
2)新建接口
增加FeignClient注解
调用:
主启动类增加EnableEurekaClient注解
* Hystrix断路器 *
专门用来处理分布式的延迟和容错的开源库,
保证一个依赖出问题的情况下,不会导致整体的服务失败,避免级联故障,提高分布式系统的弹性。
向消费者抛出一个可处理的备选响应,而不是长时间的等待或者抛出异常。
服务熔断(提供端produce的熔断)
熔断机制是应对雪崩效应的一种微服务链路保护机制
缺点:
会导致方法膨胀;同时方法和业务绑定一样,高度耦合
服务熔断配置
1)pom.xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
2)修改对应的id
3)增加HystrixCommand注解,fallbackMethod表示当抛出异常时候,调用的方法名称
服务降级
1)新建一个类DeptClientServiceFallbackFactory,实现FallbackFactory
2)添加注解服务异常注解
3)消费者增加yml配置:
服务熔断和服务降解
服务熔断:熔断是对某个服务熔断和服务异常进行处理
服务降解:降级是要关闭某个服务减少服务器的压力;
避免方法膨胀;解耦;
zuul路由网关
过滤、保护的作用
1)添加网关的注解EnableZuulProxy
2)在网关进行yml配置,对真实的微服务名称进行隐藏
ignored-services: “*” 忽略多个的微服务名称
SpringCloud Config
为了统一管理配置文件
1)配置git项目的yml
2)主启动类增加EnableConfigServer注解
以上是关于springcloud学习笔记的主要内容,如果未能解决你的问题,请参考以下文章
springcloud-Finchley学习笔记-gateway网关自定义过滤器