1.1、简介
Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。
1.2、常用组件
2、SpringBoot回顾
以下我们使用使用Spring Boot来搭建一个微服务程序。
程序的结构:
2.1、现在先来创建Server端的程序
步1、创建server项目
登录:https://start.spring.io/
在线创建项目。
Group:输入项目的包名,cn.wangjian.springcloud
Aritifact:输入项目的名称,springcloud-movie-server
Search For Dependencies:选择依赖的项目如果Web[回车]添加到Selected Dependencies中。我们选择的是Web,JPA,H2。
最后点:Generate Project下载项目。
步2、导入STS
解压下载的zip文件,在STS导入时,选择导入maven项目:
导入以后,建议在pom.xml文件后面,添加aliyun的maven仓库地址,可以更快的下载依赖:
<repositories>
<repository>
<id>aliyunmaven</id>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</repository>
</repositories>
步3、开发SQL语句
在classpath下添加
schema.sql,这也是默认创建数据表的Sql文件。
data.sql,这也是默认初始化数据的SQL文件。
在classpath:schema.sql中添加以下内容:
drop table movie if exists;
create table movie(
id bigint generated by default as identity,
name varchar(50),
author varchar(50)
);
注意:
Generated by default as identify为h2的语法,意思是指id的值为自动生成。
在classpsth:data.sql中添加以下初始化数据:
insert into movie values(1,'红高粱','张艺谋');
insert into movie values(2,'让子弹飞一会儿','姜文');
步4、开发JavaBean
package cn.wangjian.springcloud.entity;
//..导入的包略..
@Entity
@Table(name="movie")
public class Movie {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
@Column
private String name;
@Column
private String author;
//..get/set方法略..
}
步5、开发Dao接口
注意以下是一个接口,为JpaRepository的子类。
package cn.wangjian.springcloud.repository;
//..省略一些imports..
@Repository(value="movieRepository")
public interface MovieRepository extends JpaRepository<Movie, Long> {
}
注意:
JpaRepository接口中包含有CRUD等更多操作。
步6、开发Service
package cn.wangjian.springcloud.service;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import cn.wangjian.springcloud.entity.Movie;
import cn.wangjian.springcloud.repository.MovieRepository;
@Service(value="movieService")
public class MovieService {
/**
* 使用@Autowaired或是使用@Resource都可以
*/
@Resource(name="movieRepository")
private MovieRepository movieRepository;
public Movie findById(Long id) {
//如果存在,则返回Movie对象,否则返回null
return movieRepository.findById(id).orElse(null);
}
}
步7、开发Controller
package cn.wangjian.springcloud.controller;
import javax.annotation.Resource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import cn.wangjian.springcloud.entity.Movie;
import cn.wangjian.springcloud.service.MovieService;
@RestController
public class MovieController {
@Resource(name="movieService")
private MovieService movieService;
@GetMapping("/movie/{id}")
public Movie findById(@PathVariable(name="id")Long id) {
return movieService.findById(id);
}
}
步8、修改配置文件
classpath目录下的application.properties或application.yml都可以做为spring boot的配置文件。其中application.yml语言的操作,更方便,且在开发环境下,还可以提示帮助。
添加以下内容,注意缩进:
server:
port: 6789
#以下配置数据库连接信息,使用h2内置的数据库
spring:
jpa:
database: h2
generate-ddl: true
show-sql: true
hibernate:
ddl-auto: none
logging:
level:
root: INFO
cn.wangjian.springcloud: INFO
步9、现在修改启动类
修改类:SpringcloudMovieServerApplication.添加以下注解:
package cn.wangjian.springcloud.springcloudmovieserver;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
@SpringBootApplication
@ComponentScan(basePackages= {"cn.wangjian.springcloud"})
@EnableJpaRepositories(basePackages= {"cn.wangjian.springcloud.repository"})
@EntityScan(basePackages= {"cn.wangjian.springcloud.entity"})
public class SpringcloudMovieServerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringcloudMovieServerApplication.class, args);
}
}
步10、启动并访问
在SpringcloudMovieServerApplication 类上点右键,运行为spring Boot App:
启动成功以后显示:
访问:
http://localhost:6789/movie/1
http://localhost:6789/movie/2
显示结果:
{"id":2,"name":"让子弹飞一会儿","author":"姜文"}
到此,SpringBoot程序,已经开发完成。
2.2、创建客户端程序
同上,使用spring官网生成项目结构。
步1、创建项目
这儿只需要web模块即可。Spring boot 2.1.2目前(2019-1-23)为最新版本。
步2、将代码导入到STS中
导入以后的代码:
步3、创建JavaBean
创建一个与Server中相同的JavaBean只是不需要添加JPA的注解。
package cn.wangjian.springcloud.entity;
public class Movie {
private Long id;
private String name;
private String author;
}
步4、创建Controller
package cn.wangjian.springcloud.controller;
import javax.annotation.Resource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import cn.wangjian.springcloud.entity.Movie;
@RestController
public class MovieClientController {
//添加RestTemplate,使用Autowaried或是使用@Resource都可以
@Resource(name="restTemplate")
private RestTemplate restTemplate;
@GetMapping("/movie/client/{id}")
public Movie findById(@PathVariable Long id) {
return restTemplate.getForObject("http://localhost:6789/movie/"+id, Movie.class);
}
}
上面的URL是通过硬编码写到代码中的,也可以配置到application.yml中:
#用户配置
movie:
url: http://localhost:6789/movie/
然后就可以在Controller中引用了:
package cn.wangjian.springcloud.controller;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import cn.wangjian.springcloud.entity.Movie;
@RestController
public class MovieClientController {
//添加RestTemplate,使用Autowaried或是使用@Resource都可以
@Resource(name="restTemplate")
private RestTemplate restTemplate;
@Value("${movie.url}")
private String movieUrl;
@GetMapping("/movie/client/{id}")
public Movie findById(@PathVariable Long id) {
return restTemplate.getForObject(movieUrl+id, Movie.class);
}
}
步5、修改yml文件
修改classpath:application.yml配置文件,因为主是一个web应用,所以,只需要配置端口即可:
内容如下:
server:
port: 6799
步6、修改启动类添加一些注解
以下实现两个操作:
1:添加@ComponentScan的注解。
2:使用@Bean声明RestTemplate的SpringBean。
package cn.wangjian.springcloud.springcloudmovieclient;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
@ComponentScan(basePackages="cn.wangjian.springcloud")
public class SpringcloudMovieClientApplication {
//需要声明RestTemplate的实例
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(SpringcloudMovieClientApplication.class, args);
}
}
步7、启动两个项目访问
访问客户端地址:http://localhost:6799/movie/client/2
注意访问的端口为:6799。
返回:{"id":2,"name":"让子弹飞一会儿","author":"姜文"}
到此为止,一个SpringBoot,并通过RestTemplate微服务,就算是开发完成了。但还存在一些问题,我们稍后讨论。