Spring Cloud 上手实战

  • 时间:
  • 浏览:1
  • 来源:森七博客 - 专注共享张凯博客资讯

Spring简介

为那先 要使用微服务

  • 单体应用:

目前为止绝大次要的web应用软件采用单体应用,所有的应用的用户UI、业务逻辑、数据库访问都打包在另另兩个 程序运行运行上。

缺点:

 开发相互干扰,随着应用的不断升级沟通协调成本增加 应用上线否则

某个功能升级意味着着必须整体的构建、整体测试、整体发布 
  • 微服务

把单体应用拆分成小的、松藕合分布式服务的形式 

每个应用一定是独立构建、独立部署与测试,应用也是独立发布,应用于应用直接通常通过restful API接口的形式进行相互调用。 

正确处理了单体应用带来的困扰。 

Spring cloud 是那先

发展历史

  1. 502,Rod Johonson发表了<<Expert One-on-One J2EE Design and Development>>,
  2. 涵盖了3万行的代码在包com.interface21中
  3. 503,Juerge Hoeller,Yann Caroff 联系Rod,将书中代码开源,Yann提出Spring你你你这种词,冠于书中代码;
  4. 并发布0.9,使用Apache 2.0协议;Thomas Risberg负责Spring JDBC;Ben Alex将Acegi Security贡献给Rod和Juergen
  5. 504,1.0发布
  6. 505,<<Professional Java Development with Spring Framework>> <<Pro Spring>>出版;1.2.6发布。
  7. AspectJ Leader Adrian Coyler加入Interface21作为首席科学家;
  8. 506,Security 1.0、Spring webflow 1.0发布;Spring 2.0发布;
  9. 507,Spring Batch、WebService、Integration发布;Spring 2.5发布;
  10. 508,Spring Integration 1.0,Spring 2.5.6,Spring Batch 1.0;买了g2One,一家提供Groovy and Grails的公司;
  11. 509,被VMWare发了42亿美金买下;Spring Python、STS发布、3.0发布(将包拆开,不提供超级包),买了Cloud Foundry;
  12. 2010,VMWare买了RabbitMQ公司,获得RabbitMQ和Redis技术;
  13. 2011,Spring 3.1、Spring AMQP、Spring Data JPA、Spring-data-common 1.0
  14. 、Spring Data Redis、Spring Data Mongodb发布;
  15. 2012,Rod Johnson抛弃VMWare;Spring Android、Mobile发布;
  16. 2013,VMWare 和 EMC 合力组建了一家公司,Pivotal。Spring 4.0、Spring Boot发布;
  17. 2014,Spring 4.1.3、SpringBoot 1.0发布;
  18. 2015,Spring 4.2、4.3发布;
  19. 2016,Spring 4.3 GA
  20. 2017,Spirng 5.x

Spring的经常出先让EJB等重量级的容器技术逐渐走向末路。 

Spring 通过对Bean的生命周期的管理,里能快速方便的实现业务的逻辑正确处理。 

Spring 里能方便的整合几乎所有的主流的开源项目如JPA,缓存,消息组合等等,方便的进行开发。

Spring Cloud实战

本实战目的: 

全程演示怎样才能创建另另兩个 基础的、可用的Spring cloud分布式应用系统 

演示Spring Cloud各次要组件怎样才能在应用完后 协调、调用。 

了解整个Spring Cloud的项目基本具体情况,有另另兩个 初步的认识。 

本实战JAVA采用JDK8 

Spring Boot版本采用最新2.1.0 release. 

Spring Cloud版本采用Greenwich.M1。

2.2.1. Spring Cloud基础搭建

使用

阿里云的spring cloud 架构图在线设计地址: https://www.freedgo.com 即可使用Freedgo Desing 进行图形设计.

架构预览地址:

https://www.freedgo.com/draw_index.html?#Uhttps://www.freedgo.com/templates/network/springcloud_aliyun.xml

Freedgo Design 是一in款在线绘制专业图形的网站。Freedgo Design里能绘制各种类型的图形,针对业务逻辑的流程图,软件设计ER模板,工作流,各种云平台的系统部署架构图包括阿里云、AWS云、腾讯云、Oracle、Asure云、IBM云平台等。

2.2.1.1. 建立基础代码

开发工具:Intellij idea 

1、 建立另另兩个 mvn 工程项目 

使用的java jdk 采用jdk8

2.2.1.2. 服务发现

建立子模块discovery-service

其他人里能看过mvn 依赖导入了netflix-eureka-server 

Spring boot 会启动服务发现服务

<dependency>   <groupId>org.springframework.cloud</groupId>   <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency> 
2.2.1.3. 服务配置

建立子模块config-service

<dependency>   <groupId>org.springframework.cloud</groupId>   <artifactId>spring-cloud-config-server</artifactId></dependency> 

2.2.1.4. 服务路由

服务路由采用 Netflix Zuul 

通过服务路由作为eureka client,里能被发现服务监控

<dependency>   <groupId>org.springframework.cloud</groupId>   <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency>   <groupId>org.springframework.cloud</groupId>   <artifactId>spring-cloud-starter-netflix-zuul</artifactId></dependency> 

基础的组件创建完毕

2.2.1.5. 用户认证中心

2.2.1.6. 业务服务模块

org.springframework.bootspring-boot-starter-web

org.springframework.cloudspring-cloud-starter-oauth2

org.springframework.cloudspring-cloud-starter-security

2.2.2. 服务发现

传统服务发现法律措施通过网络DNS和负载均衡设备实现,必须网络和硬件设置支持,维护成本高,网络环境复杂化 

指在云的服务发现具有如下优点 

高可用,热部署 

负载均衡 

健康检查,容错机制 

抽象服务的逻辑名称 

使用Spring与Netflix Eureka实现服务发现 

实现服务发现功能必须配置服务发现端及必须注册服务配置客户端 

1、 发现服务端配置 

服务注册必须50 s 的时间才能显示在 Eureka 服务中,否则 Eureka 必须从服务接收3次连续心跳包 ping,每次心跳包 ping 间隔10 s,否则 才能使用你你你这种服务。在部署和测试服务时,要牢记你你你这种点。 

application.yml

server:

port: 8761

# Eureka 服务器将要监听的端口

eureka:

client:

registerWithEureka: false #太大再说使用 Eureka 服务进行注册

fetchRegistry: false #太大再说在本地缓存注册表信息

使用另另兩个 新的注解 @EnableEurekaServer ,就里能让其他人的服务成为另另兩个 Eureka 服务

2、 服务发现客户端配置 

以config-service为例 

必须做2件事情 

1、 成为服务发现的客户端

org.springframework.cloudspring-cloud-starter-netflix-eureka-client

2、 配置application.yml(对应config-server来说其他人只必须配置如下)

spring:  cloud:    config:      discovery:        enabled: true 

启动运行查看

http://localhost:8761/eureka/apps/config-service。 

应用作为服务发现的客户端设置 

1、 加在客户端依赖

org.springframework.cloudspring-cloud-starter-netflix-eureka-client

2、 配置application.yml

spring:

application:

name: business_service

eureka:

instance:

preferIpAddress: true

#注册服务的 IP,而都在服务器名称

client:

registerWithEureka: true #向 Eureka 注册服务

fetchRegistry: true

serviceUrl: #拉取注册表的本地副本

defaultZone: http://localhost:8761/eureka/ #Eureka 服务的位置

同样通过mvn spring-boot:run 打开 http://localhost:8761 ,business_service否则 注册成功

使用服务发现查服务

2.2.3. 用户认证中心

OAuth2协议说明:

整体OAuth协议包括两方面: 

1、 访问授权:用户必须通过授权获取令牌 

2、 资源权限:通过授权的用户访问受保护的资源,根据定义访问权限来决定算不算里能访问资源 

配置说明: 

启用OAuth授权服务 

增加 @EnableAuthorizationServer 用于告诉 Spring Cloud,该服务将作为 OAuth2 服务

package com.yuaoq.train.business;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;

@SpringBootApplication

@EnableResourceServer

@EnableAuthorizationServer

public class DemoApplication {

public static void main(String[] args) {

SpringApplication.run(DemoApplication.class, args);

}

}

OAuth访问授权配置,配置注册的客户端程序运行运行

@Configuration

public class Auth2Config extends AuthorizationServerConfigurerAdapter {

@Autowired

private AuthenticationManager authenticationManager;

@Autowired

private UserDetailsService userDetailsService;

// 覆盖 configure()法律措施。这定义了那先 客户端将注册到服务

@Override

public void configure(ClientDetailsServiceConfigurer clients) throws Exception {

clients.inMemory()

.withClient(“yuaoq”)

.secret(“{noop}secret”)

.authorizedGrantTypes(

“refresh_token”,

“password”,

“client_credentials”)

.scopes(“webclient”,”mobileclient”);

}

// 该法律措施定义了 AuthenticationServerConfigurer 中使用的不同组件。这段代码告诉 Spring 使用 Spring 提供的默认验证管理器和用户完全信息服务

@Override

public void configure(AuthorizationServerEndpointsConfigurer endpoints)

throws Exception {

endpoints

.authenticationManager(authenticationManager)

.userDetailsService(userDetailsService);

}

}

配置用户权限

@Configuration

public class WebSecurityConfigurer extends WebSecurityConfigurerAdapter {

@Override

@Bean

// AuthenticationManagerBean 被 Spring Security 用来正确处理验证

public AuthenticationManager authenticationManagerBean() throws Exception {

return super.authenticationManagerBean();

}

// Security 使用 UserDetailsService 正确处理返回的用户信息,那先 用户信息将由 Spring Security 返回

@Override

@Bean

public UserDetailsService userDetailsServiceBean() throws Exception {

return super.userDetailsServiceBean();

}

@Override

protected void configure(AuthenticationManagerBuilder auth) throws Exception {

//  configure()法律措施是定义用户、密码和角色的地方

auth.inMemoryAuthentication()

.withUser(“admin”)

.password(“{noop}password”)

.roles(“ADMIN”,”USER”)

.and()

.withUser(“anyone”)

.password(“{noop}password”)

.roles(“USER”);

}

}

获取用户信息(提供给其他服务获取用户信息使用)

@GetMapping(value = “/auth/user”)

public Map user(OAuth2Authentication user) {

Map userInfo = new HashMap();

userInfo.put(“user”, user.getUserAuthentication().getPrincipal());

userInfo.put(“authorities”, AuthorityUtils.authorityListToSet(user.getUserAuthentication().getAuthorities()));

return userInfo;

}

通过postman测试 

 

自此提供了另另兩个 用户认证的微服务模块.

2.2.3.1. 业务模块微服务

1、 对外提供restful Api 

@RestController :由spring web提供的指在restful 的接口标签 

生成另另兩个 restful api

@PostMapping(“/list”)

public ResponseEntity> getBusiness() throws Exception {

List list = new ArrayList();

list.add(“a”);

list.add(“b”);

return Optional.of(list)

.map(a -> new ResponseEntity>(a, HttpStatus.OK))

.orElseThrow(() -> new Exception(“error”));

}

使用postman调用接口

 

从postman返回的结果里能看过401,未授权。 

否则 business_service服务引入了spring-cloud-starter-security 那末 默认是会对所有访问做安全控制。

2、 服务的授权保护 

现在business/list 是未授权,那为什配置另另兩个 受保护的oauth2.0资源,通过如下步骤 

设置服务是另另兩个 受oauth保护的资源 

 

定义应用的OAuth属性定义回调 URL

security:  oauth2:    resource:      user-info-uri: http://localhost:8282/auth/user 

定义授权用户里能访问

@Configuration

public class ResourceServerConfig extends ResourceServerConfigurerAdapter {

//  antMatchers()允许开发人员限制对受保护的 URL 和 HTTP DELETE 动词的调用

// hasRole()法律措施是另另兩个 允许访问的角色列表,该列表由逗号分隔

@Override

public void configure(HttpSecurity http) throws Exception {

http.authorizeRequests()

.antMatchers(HttpMethod.POST, “/api/v1/business/**”)

.hasRole(“ADMIN”)

.anyRequest()

.authenticated();

}

}

该段代码说明具有ADMIN角色的用户里能访问/api/v1/business/ 下的所有的POST 请求 

验证如下: 

至此通过OAuth2.0保护微服务的基本做法否则 完成。

2.2.4. 服务路由网关 

服务网关:服务客户端不再直接调用服务。取而代之的是,服务网关作为单个策略执行点(Policy Enforcement Point,PEP),所有调用都通过服务网关进行路由,否则 被路由到最终目的地。 

@EnabeZuulServer 使用此注解将创建另另兩个 Zuul 服务器,它太大再加载任何 Zuul 反向代理过滤器,统统会使用 Netflix Eureka 进行服务发现.

成为另另兩个 服务网关步骤: 

1、 加在 @EnableZuulProxy 

 

2、 在application.yml加在route 规则

zuul:  sensitive-headers: set-cookies  routes:    business_service: /busi/** 

通过postman测试如下:

本文由

csy2016_

发布在

ITPUB

,转载此文请保持文章完全性,并请附上文章来源(ITPUB)及本页链接。

原文链接:http://www.itpub.net/2019/06/25/2275/