首页 > 其他分享 >Spring Cloud篇

Spring Cloud篇

时间:2024-05-23 10:55:52浏览次数:18  
标签:zuul Spring app eureka user run yml Cloud

-----------------------------------------------------------------
SOA与微服务:
SOA着重中央管理,一个应用包含大块业务逻辑。微服务着重分散管理,一个应用是小块业务逻辑。微服务是SOA的精细化演进。
-----------------------------------------------------------------

D版对应Boot1.5,对应Spring4
F版对应Boot2.0,对应Spring5
--------------------------------------------------------------
简单记录eureka:
添加starter-netflix-eureka-server依赖。
主要配置实例名、提供客服端服务地址。如下:
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/
启动类添加@EnableEurekaServer、@SpringBootApplication即可
--------------------------------------------------------------
简单记录app
添加starter-netflix-eureka-client依赖(注入eureka)。
主要配置eureka的注册地址,应用在eureka中的实例名称。如下:
eureka:
  client:
    service-url:
      defaultZone: http://localhost:7001/eureka
  instance:
    instance-id: app-user1001
启动类添加@EnableEurekaClient、@SpringBootApplication即可
--------------------------------------------------------------
简单记录zuul:
添加starter-netflix-eureka-client依赖(注入eureka)。
添加zuul自己的starter-netflix-zuul依赖。
主要配置eureka的注册地址,应用在eureka中的实例名称(默认是ip:应用名:端口)。如下:
eureka:
  client:
    service-url:
      defaultZone: http://localhost:7001/eureka/
启动类添加@EnableZuulProxy、@EnableEurekaClient、@SpringBootApplication即可生效。
如何知道生效?
直接访问某应用:应用ip:应用端口/user,返回数据
通过zuul+应用名访问应用:zuul的ip:zuul的端口/应用服务名/user,返回同样的数据
zuul可以设置将某个微服务应用名映射成定义的路径,也可以指定只能由规定的路径访问,真实服务名不能访问。

怎样使ZuulFilter生效?
继承ZuulFilter,包含4个方法:filterType、filterOrder、shouldFilter、run
filter中4个值:
pre:请求被路由之前调用,可实现身份验证
route:请求路由到微服务,可构建发送给微服务的请求
post:请求路由到微服务以后执行,可添加响应,将响应从微服务发送给客户端
error:其它阶段发生错误时执行
先执行完所有的pre、再执行完所有的route、再执行完所有的post
除了这4种,可自定义过滤器类型

pre: 只要shouldFilter返回true,就会执行run方法,某一个返回false,只有本身的filter不执行run,不影响其它filter的run的执行
route:只要shouldFilter返回true,就会执行run方法,某一个返回false,只有本身的filter不执行run,不影响其它filter的run的执行
post: 只要shouldFilter返回true,就会执行run方法,某一个返回false,只有本身的filter不执行run,不影响其它filter的run的执行
postfilter 的filterOrder、shouldFilter、run中出现异常,进入errorfilter,filterType出现异常不会进入errorfilter
prefilter 的filterOrder、shouldFilter、run中出现异常,进入errorfilter,filterType出现异常不会进入errorfilter
routeFilter 的filterOrder、shouldFilter、run中出现异常,进入errorfilter,filterType出现异常不会进入errorfilter
普通业务方法的异常不会进入errorfilter
浏览器中输入地址,一次访问次序:pre,route,业务方法,post,所以鉴权写在pre中,
研究一下路由是什么鬼?比如/demo/test转发到到demo服务,不是负载均衡自动处理的吗?zuul和Ribbon怎么结合的
--------------------------------------------------------------
过滤器怎么算拦截,怎样算通过?
RequestContext context = RequestContext.getCurrentContext();
拦截:
context.setSendZuulResponse(false); pre、route、post都走,不走业务方法,提示没有权限
context.setResponseStatusCode(401);//返回状态码401
context.setResponseBody(你没有权限,不允许访问);//返回内容Unauthorized
通过:
context.setSendZuulResponse(true);设为true或者注释掉这一句,全都走,包括过滤器和业务方法
关键:设置为true表示对请求路由、设置为false表示不对请求路由
--------------------------------------------------------------
路由测试:
zuul服务器中配置路由
zuul:
  routes:
    demo: #这个是随便起的
       path: /app-user/** #表示浏览器输入http://localhost:8001/app-user/user时(app-user是服务名,user是方法的映射路径),
                                       路由到serviceId指定的app-user这个服务上,有多个实例时Ribbon负载均衡
       serviceId: app-user# 这个是应用名,不是实例id,
    demo2:
       path: /app-dept/**
       serviceId: app-dept
--------------------------------------------------------------
鉴权篇
如果使用zuul的话,所有请求都会先到zuul,判断一下请求头中有没有token即可,不需要做单点登录,token中包含身份和权限信息。
引入starter-oauth2依赖。
过程:
1、哪些url不需要token验证,直接返回值,怎样做?在zuul服务器上
@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring().antMatchers("/open/**");
}
2、需要鉴权的:
springsecurity-oauth2 提供认证、生成jwt功能,zuul的鉴权自己实现,通过zuul,后端的微服务在request中也能获取jwt。
想一想如果如果不是前端传jwt,即不在request中,应该怎么获取jwt?如下:
用restTemplate获取,参数httpEntity,httpEntity有HttpHeaders和Map构成的请求体,获取的jwt不一样,但解析后一样
请求路径 http://localhost:8001/oauth/token
--------------------------------------------------------------
微服务内部之间请求 不会拦截,不走zuul,测试
@Bean
public RestTemplate getRestTemplate()
{
  return new RestTemplate();
}
Dept dept = restTemplate.getForObject("http://127.0.0.1:1011/dept",com.leiyuke.entity.Dept.class);
--------------------------------------------------------------
简单记录Ribbon
如果不加Ribbon负载均衡,前端访问后端是默认轮询的,但是微服务之间用
restTemplate.getForObject("http://app-dept/dept",com.leiyuke.entity.Dept.class);不会找到服务,下面可解决:
客户端(即调用方引入)依赖:starter-netflix-ribbon
在生成RestTemplate()的bean上加@LoadBalanced即可,默认轮询。
如果不使用轮询,则需要实现一个IRule接口的bean,new RandomRule()随机,new RetryRule()重试等。
使用@LoadBalanced,只有一个示例还不行。。。好像
--------------------------------------------------------------
简单记录Hystrix
添加starter-netflix-hystrix依赖
启动了添加@EnableCircuitBreaker注解
业务方法:添加@HystrixCommand(fallbackMethod="hystrix_getUserList"),注意原方法与回调方法返回值要一样
@GetMapping("/list")
@HystrixCommand(fallbackMethod="hystrix_getUserList")
public List<User> getUserList(){
  User u1 = new User("1","sl",11);
  List<User> list = new ArrayList<User>();
  list.add(u1);
  if(1==1) {
    throw new RuntimeException("dsdsdsdsd");
 }
 return list;
}

public List<User> hystrix_getUserList(){
  User u3 = new User("31","sl111",123);
  List<User> list = new ArrayList<User>();
  list.add(u3);
  return list;
}
--------------------------------------------------------------
简单记录Config:
提供集中化的配置,是配置中心,不需要注册到ureka中
思路:在github上创建一个仓库,修改仓库里的配置文件后,重启微服务,应用程序微服务能读到github上修改的文件的属性
过程:搭建一个config-server微服务
引入依赖:cloud-config-server,启动类添加@EnableConfigServer注解,配置文件如下:指定git仓库地址
spring:
  application:
    name: config-server
  cloud:
    config:
      server:
        git:
          uri: https://github.com/wrenlei/cloudconfig.git #GitHub上面的git仓库名字
          search-paths: mycloud #git仓库根目录的下一层,文件在根目录下时可以不用配置
         #username: git仓库的账号
         #password: git仓库的密码
github上文件(文件名app-user.yml)如下:以profiles区分环境,3个横线作为分隔,其他与application.yml配置一模一样
spring:
  profiles: dev #开发环境
  application:
    name: app-user
---
spring:
  profiles: test #测试环境
  application:
    name: app-user
访问服务端:http://localhost:7001/app-user-dev.yml,显示的是开发环境的配置
客户端(即普通微服务怎样配置?)
引入依赖:cloud-config-client
添加配置文件bootstrap.yml如下,指定profile、config-server的地址,和github上的文件名,分支
spring:
  cloud:
    config:
      name: app-user #需要从GitHub上读取的资源名称,注意没有yml后缀名
  profile: dev
  label: master
  uri: http://localhost:7001 #config server地址
这样bootstrap.yml的优先级高于application.yml,应用启动,读取的是bootstrap.yml,通过config-server最终读取github的文件
github上改了属性,客户端程序 重启后生效。
bootstrap.yml中配置的profile,在github上要存在。
实际开发中,每一个应用程序都配置一个bootstrap.yml,github中都有一个它的配置。

 

标签:zuul,Spring,app,eureka,user,run,yml,Cloud
From: https://www.cnblogs.com/javasl/p/13434401.html

相关文章

  • SpringBoot设置Session失效时间
    springboot的yml文件中设置session的过期时间#Session超时时间设置,单位是秒,默认是30分钟servlet:session:timeout:3600s当过期时间是大于1分钟的时候是没有什么问题的,但是如果设置过期时间小于1分钟,就会失效。servlet:session:timeout:10......
  • SpringBoot发送邮件(二)
    不需要在application.yml中进行配置jdk:8POM依赖<!--发送邮件--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency>工具类/***邮件发送消息*/@UtilityCl......
  • SpringBoot发送邮件(三)
    jdk:17springboot:3.0+POM依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency><dependency><groupId>javax.mail</group......
  • SpringBoot动态定时任务
    其实SchedulingConfigurer实现方法很简单,只需要实现SchedulingConfigurer并重写configureTasks方法,在启动类必须加上@EnableScheduling注解即可。@Configuration@EnableScheduling@Slf4jpublicclassRuleTaskimplementsSchedulingConfigurer{privatevolatileSch......
  • SpringBoot发送邮件(一)
    POM依赖<!--发送邮件--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency>邮箱配置mail:host:smtp.partner.outlook.cn#发送邮件服务器user......
  • Spring Boot中的 6 种API请求参数读取方式
    使用SpringBoot开发API的时候,读取请求参数是服务端编码中最基本的一项操作,SpringBoot中也提供了多种机制来满足不同的API设计要求。接下来,就通过本文,为大家总结6种常用的请求参数读取方式。如果你发现自己知道的不到6种,那么赶紧来查漏补缺一下。如果你知道的不止6种,那么告诉大......
  • spring-xml文件头
    1.beans<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.sp......
  • 讲一下什么是Spring
    Spring是一个轻量级的IoC和AOP容器框架。是为Java应用程序提供基础性服务的一套框架,目的是用于简化企业应用程序的开发,它使得开发者只需要关心业务需求。常见的配置方式有三种:基于XML的配置、基于注解的配置、基于Java的配置。主要由以下几个模块组成:SpringCore:核心类库,提供I......
  • Spring框架中都用到了哪些设计模式?
    这是一道相对有难度的题目,你不仅要回设计模式,还要知道每个设计模式在Spring中是如何使用的。简单工厂模式:Spring中的BeanFactory就是简单工厂模式的体现。根据传入一个唯一的标识来获得Bean对象,但是在传入参数后创建还是传入参数前创建,要根据具体情况来定。工厂模式:Spring......
  • Spring6日志
    JakartaCommonsLoggingAPI是一种Java日志记录抽象层,它允许开发者在运行时插入所需的日志框架,如Log4j、JavaUtilLogging、SLF4J等。该API提供了一个简单的日志记录接口,使得开发者无需关心底层使用的具体日志框架。使用JakartaCommonsLoggingAPI的好处包括:灵......