Spring 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中都有一个它的配置。

 

posted @ 2024-05-23 10:45  雷雨客  阅读(6)  评论(0编辑  收藏  举报