暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SpringCloud-1

Coding On Road 2019-01-23
60

1.1、简介

Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。

1.2、常用组件



2SpringBoot回顾

以下我们使用使用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中。我们选择的是WebJPAH2

最后点:Generate Project下载项目。

 

2、导入STS

解压下载的zip文件,在STS导入时,选择导入maven项目:

 

 

导入以后,建议在pom.xml文件后面,添加aliyunmaven仓库地址,可以更快的下载依赖:

<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 identifyh2的语法,意思是指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.propertiesapplication.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声明RestTemplateSpringBean

 

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微服务,就算是开发完成了。但还存在一些问题,我们稍后讨论。


文章转载自Coding On Road,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论