SpringBoot与SpringCloud初识

一、SpringBoot初识

  1.介绍

  SpringBoot中web.xml springMVC甚至于mybatis的主配置文件都不用进行描述了,全部可以使用注解解决。

反射操作类,要比dom去操作xml文件快很多,所以使用注解,会更加的迅速。注解开发,是面向对象的开发方式,所以使用注解开发,更加优秀。

  可以帮助开发者快速的启动一个WEB服务,无需依赖外部的Servlet容器,使部署变得简单。

spring1.0时代

JDK1.5开始使用注解,在Spring.x时代,都是通过xml文件配置bean。

spring2.0时代

org.springframework.stereotype.@Component
org.springframework.stereotype.@Controller
org.springframework.stereotype.@Service
org.springframework.stereotype.@Repository
org.springframework.stereotype.@Scope
org.springframework.beans.factory.annotation.@Autowired 

   引入了注解的开发方式,

spring3.x

org.springframework.context.annotation.AnnotationConfigApplicationContext
org.springframework.context.annotation.@Configuration
org.springframework.context.annotation.@Bean
org.springframework.context.annotation.@Value
org.springframework.context.annotation.@Import 

配置类,相当于在xml中配置了一个bean对象 

@Configuration
public class BeanConfig {
@Bean
public User user() { //方法名称作为bean的id
return new User();
}
}

 

spring4.x

使用条件注解强化之前版本的注解。
org.springframework.context.annotation.@Conditional 

2.创建springBoot项目 

 

自动创建Spring Starter Project

当然也可以创建maven项目 但是创建这个依赖的springboot的包可以采用视图勾选的方式进行。

选择maven项目,jdk版本至少1.6,打包方式采用jar而不是war包,因为采用的版本为3.0 后面就没有web.xml文件了

可以在里面搜索mybatis、web等等,会自动帮助我们进行配置,当然c3p0等数据源,没有,需要手动配置

创建出来的结构如下,会为我们创建启动类。其中SpringBootHelloApplication代码如

package com.atguigu.springboot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringBootHelloApplication {

	public static void main(String[] args) {
		SpringApplication.run(SpringBootHelloApplication.class, args);
	}

}

可以看到,以下@SpringBootApplication注解所标识的是springBoot的启动类。 表示去运行哪个运行程序

这里可以看到,帮我们生成了一个properties文件用于存放我们的配置信息,没有xml文件

这里的application.properties 有提示信息,可以为服务进行配置,提供方便

server.context-path=/   #上下文路径 指定为/的话相当于部署在Root目录下 当然可以指定/xxx在webapps下
server.port=80 #tomcat端口
server.session.timeout=3600   #60秒 session过期 web.xml中配置的是分钟 这里是秒
server.tomcat.max-threads=800
server.tomcat.uri-encoding=UTF-8

中也可以看到

package com.atguigu.springboot;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBootHelloApplicationTests {

	@Test
	public void contextLoads() {
	}

}

他帮我们写了这个的好处在于,我们在进行@autowried依赖注册测试时,不需要再 自己手写IOC容器。

其中pom文件中已经帮我们导入了很多的spring的jar包,我们创建的工程都要继承这个父工程,用具继承jar包

手动创建springboot项目(未联网)

指定编译jdk版本。

 

<project>
    ...
    <build>
        <plugins>
            <!-- 修改maven默认的JRE编译版本,1.8代表JRE编译的版本,根据自己的安装版本选择1.7或1.8 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
    ...
</project>

创建我们的maven工程 打包方式为jar包, 并设置jdk版本信息,省略pacjking编译版本就是jar。

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.20.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

其父工程指定为springBoot  导入web模块 后会自动加载web环境配置,文件上传解析器,视图解析器,异常解析器,都不用进行配置了(springMVC,Tomcat等)都进来了简化了我们的操作

也就是说我们只需要导入web模块,就可以进行编写了。

 

 

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-tomcat</artifactId>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

spring-boot-startter-xxxx

yaml配置也是一种配置文件,和properties文件类似,但是是树形结构,结构比properties清晰,spring建议使用yaml文件进行配置。

 

thymeleaf也是视图技术,由spring提供,建议使用。

@componentScan 可以指定扫描包的结构,如果不指定,框架会采用默认方式扫描:自动扫描主程序所在的包和子包

 

 

@ComponentScan(basePackages="com.atiguigu.springboot")

代码写在springboot的启动类上

@SpringBootApplication
@ComponentScan(basePackages="com.atiguigu.springboot")
public class SpringBootHelloApplication {
	public static void main(String[] args) {
		SpringApplication.run(SpringBootHelloApplication.class, args);
	}
}

书写的代码和springMVC没有任何区别。

@RestController直接放在类上面即可

 的作用相当于@Controller和@ResponseBody

直接在类上声明,即可,所有的方法都会执行@Response,

所以@RestController主要适用于服务项目上,不用于跳转页面。

 

service层完全一样,只需要@service和@autowried即可

 

springBoot集成mybatis 导入springboot对mybatis的整合

 

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!-- 数据库连接池 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.0.5</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.1.1</version>
        </dependency>

这里druid版本建议使用最新版本1.11.1否则可能报错

另外连接池版本,应该使用8.0.11,否则报错

并在resource下生的config生成application.yml文件

---表示分隔符

key和:之间不能有空隙

:和value之关键需要有空格

---  
spring: 
  datasource:
    name: mydb
    type: com.alibaba.druid.pool.DruidDataSource
    url: jdbc:mysql://127.0.0.1:3306/atcrowdfunding
    username: root
    password: root
    driver-class-name: com.mysql.jdbc.Driver
mybatis:   
  mapper-locations: classpath*:/mybatis/mapper-*.xml
  type-aliases-package: com.atguigu.**.bean

注意:这里的配置跟properties是相通的,转为properties文件写成spring.datasource.name=mydb

这里的 com.mysql.jdbc.Driver 已经被替换成com.mysql.cj.jdbc.Driver

 

注意这里的mapper-location意思是Mybatis的Xml文件的地址,我们知道@MapperScan("com.atguigu.**.dao")是用于扫描我们接口文件的,如果扫描到的接口文件与xml文件在一起那么就会自动进行映射,如果不在一起那么,这里必须要指定mapper的位置

type-aliases-package:用于整合mybstis中别名的位置

controller层

可以直接在controller的类上面加requestMapper("/page")这样的话,访问就需要class上的路径与方法上的路径。挤在一起

 

关于mybatis的注解

@EnableTransactionManagement 开启事务管理 加在springboot的启动类上面即可。

对类加事务的时候就是加入@Transactional注解    @Transactional(noRollbackFor=Exception.class)

扫描Dao的注解@MapperScan("com.atguigu.**.dao") 同样是加载springboot的启动类上,与以前的一样,创建代理对象 

使用注解写sql,在我们的接口文件中,以前是一个mapper一个接口,现在可以将sql直接写在接口中

@Insert("insert into t_member(loginacct)values (#{loginacct})")  @select(".....")

public int insertMember(Menber menber)

如果是复杂的sql还是使用我们的xml文件进行书写

 

继承freemaker

将freemaker的配置弄过来 ,同样放在我们的application.properties文件下,当然也可以放在aoolication.yml文件下

spring.freemarker.allow-request-override=false
spring.freemarker.allow-session-override=false
spring.freemarker.cache=true
spring.freemarker.charset=UTF-8
spring.freemarker.check-template-location=true
spring.freemarker.content-type=text/html
spring.freemarker.enabled=true  
spring.freemarker.expose-request-attributes=false
spring.freemarker.expose-session-attributes=false
spring.freemarker.expose-spring-macro-helpers=true
spring.freemarker.prefer-file-system-access=false
spring.freemarker.suffix=.ftl
spring.freemarker.template-loader-path=classpath:/templates/
spring.freemarker.settings.template_update_delay=0
spring.freemarker.settings.default_encoding=UTF-8
spring.freemarker.settings.classic_compatible=true 
spring.freemarker.order=1

然后根据配置文件中的内容,建立templates文件夹,并将tfl文件放入文件夹中

最有一个优先级配置spring.freemarker.order=1
 比jsp的解析优先级高

 

热部署,我们在部署的时候,jsp代码有变化了,不用重新启动tomcat,他自己佳慧识别,并在下一次刷新的时候,自动使用。

但是对于代码进行修改,没有办法进行识别。

现在我们希望使用的时候,修改java代码,tomcat也会自动帮助我们进行更新代码。

只需要加入支持的包

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional><!-- 这个需要为 true 热部署才有效-->
    </dependency>

可以看到项目后有一个devtools,说明项目是热部署的项目。

这样的话修改代码,tomcat也会自动识别并加载代码。

 

 

动态启用服务器端口。

springboot项目在不同的环境下(开发、测试、生产),服务端口不一致怎么办?

比如现在处于开发阶段,那么端口号为8090 上线为8080那么,我们希望能够动态的设置服务器的端口号。

SpringBoot提供了Profile支持。也就是说通过prifile的设定来查找不同的配置文件,进行运行时配置,如我们右键选择。

主要是更改参数文件product就是对应的后面的那个application-product.properties

 

修改部署环境的名称和环境的部署参数,如果名称为product那么,此时配置文件名称为application-producet.properties

maintype表示启动类是那个类

注意:其他文件中的内容还是会启动的,只是你配置的那个会被覆盖掉。

 

打jar包运行,

 

多服务启动

server.address=127.0.0.1
server.tomcat.remote-ip-header=x-forwarded-for
server.tomcat.protocol-header=x-forwarded-proto
server.tomcat.port-header=X-Forwarded-Port
server.use-forward-headers=true

server.address127.0.0.1 只有本机地址才能访问,这样可以限制用户必须通过反向代理服务器进行访问。

 

springboot整合redis

导入相关的文件

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-data-redis</artifactId>
        </dependency>

在properties中配置redis 

spring.session.store-type=redis
spring.redis.database=1
spring.redis.host=127.0.0.1
spring.redis.password=123123
spring.redis.port=6379
spring.redis.pool.max-idle=8
spring.redis.pool.min-idle=0
spring.redis.pool.max-active=8
spring.redis.pool.max-wait=-1
spring.redis.timeout=60000

参数

store-type=redis 表明使用redis做session共享

datavase=1    redis一共有16个库 表明做session共享的时候 存在哪一个库里面

host表明redis的IP地址

password密码

port端口号

max-idle为连接池的最大同步连接数

timeout 毫秒

 

创建session配置类

package com.atguigu.springboot.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

@Configuration
@EnableRedisHttpSession
public class RedisSessionConfig {

}

因为将session中的数据都保存到redis中进行存储,所以如果需要保存对象,必须能够序列化。继承接口Serializable

 

springboot健康监控

依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

在yml文件中设置需要监听的端口

management:  
  port: 8400

启动后访问8400/health端口查看服务器状态    up为正在运行

在yml中配置项目信息

info:  
  app:  
    name: "@project.name@"   
    description: "@project.description@"  
    version: "@project.version@"  
    spring-boot-version: "@project.parent.version@"

并访问8400/info 即可查看

Spring Cloud

Spring Cloud 服务注册 配置中心 消息总线 负载均衡 断路器 数据监控,都可以用SpringBoot的开发风格做到一键启动和部署。

微服务 netflix(就是springCloud提供的) dubbo springCloud Spring Cloud一站式解决方案 Docker

 

Spring Cloud Netflix包含模块

          Eureka  注册中心(服务发现)

          Hystrix  断路器(将集群中坏的节点断开)

          Zuul    只能路由

          Ribbon 客户端负载均衡 从客户端决定,跟niginx不一致,Ribbon是处于客户端,nginx处于服务端

分布式的开发环境

 

web应该先去注册中心找项目,然后通过名字再来请求用户服务。

使用SpringCloud创建分布式项目

     那么创建分布式项目,首先要创建注册中心,然后创建服务,最后再创建我们的前端接收。

首先创建springBoot项目

自动引入Eureka

增加配置信息

spring.application.name=eureka-server
server.port=1001
eureka.instance.hostname=127.0.0.1
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka/

spring.application.name注册中心地址名称

eureka.client.register-with-eureka 意思为是否将自己注册到eureka上,自己就是eureka所以修改为false

eureka.client.fetch-registry  是否获取其他注册服务中上的服务,因为是单个节点所以不需要。

eureka.client.serviceUrl.defaultZone注册中心地址

在初始内容的类上加上注解,然后启动项目,即可

@EnableEurekaServer

 

创建服务项目,对于服务项目,需要引入Eureka Discovery而不是Eureka server,用于注册的服务,

增加配置信息

spring.application.name=eureka-member-service
server.port=2001
eureka.client.serviceUrl.defaultZone=http://127.0.0.1:1001/eureka/

服务名称,以及注册中心地址

并在启动类上加入@EnableDiscoveryClient 注解

 

建议采用Boot Dashboard视图,都启动后,打开registryCenter可以看到,注册成功

且只有一个节点,接下来就可以增加代码并进行测试了。那么到这里,我们就可以创建服务项目了。

 

 

 

接下来,创建客户端项目,也就是我们的的前端,当注册中心帮我们进行了会员服务之后,我们的web端都可以通过feign方式从注册中获取会员服务,同样的创建一个SpringBoot项目。

需要feign和discovery

在启动服务上加入注解@EnableFeignClients和@EnableDiscoveryClient(让注册中心发现你,不论是服务还是客户端都是需要的)

增加配置

...
spring.application.name=eureka-member-client
server.port=80
eureka.client.serviceUrl.defaultZone=http://localhost:1001/eureka/

在另外的服务中添加接口与前面名称完全一致,注解也在,然后在类上标注对应的注册名称即可

package com.atguigu.crowdfunding.service;

import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;


@FeignClient("eureka-member-service")
public interface MemberService {
	@RequestMapping("/test")
	public String test1();
	
}

注意FeignClient实际上是由http方式进行调用的,而不是socket方式进行调用,所以说必须要写上映射路径

@RequestMapping("/test")

感觉这里不如dubbo好用,效率应该更低。

 

Spring Cloud Ribbon   负载均衡

   在上面我们知道了,进行注册的时候,可能是集群注册,也就是说,你访问调用的接口时,可能访问的任一一个服务器。此时需要我们的负载均衡,而nginx是在请求进入我们web之间做事的(软负载均衡)

feign服务中已经内置了Ribbon,所以不需要额外的操作

Spring Cloud Hystrix

           服务并不能保证100%可用,如果单个服务出现问题,调用这个服务就会出现阻塞,因此坏的节点不能再访问了,一个服务不可用,就会导致所有服务都不可用,服务器的雪崩效应。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>

在web层增加熔断机制,并在启动类中增加注解@EnableHystrix

并在方法上加入注解HystrixCommand() 

	@HystrixCommand(fallbackMethod="testError")
	@RequestMapping("/test")
	@ResponseBody
	public String test(){
		String test1 = MemberService.test1();
		return test1;
	}
	
	public String testError(){
		return "errot";
	}

远程取值的时候,可以使用占位符进行取值,我在想也可以通过requestParam 进行取值

 

如果有过滤器之类的东西,那么我们以前需要在web.xml进行配置的内容,可以直接加上@webListener注解,表示这个类为监听器,监听器要实现servletContextListener接口(服务内容监听者)。

@WebServlet 声明Servlet对象

@WebFilter 过滤器filter对象

 

那么将过滤器之类的添加到项目中,需要扫描,在我们的Web程序的启动类上配置注解@ServletComponentScan 扫描我们的

@webListener

@WebServlet

@WebFilter

三个对象

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值