SpringCloud(一):用springboot实现简单服务调用
来源:互联网 发布:java 整形转byte 编辑:程序博客网 时间:2024/06/06 05:48
环境:
SpringBoot 1.4.1
Mavan 3.2.3
JDK 1.8
IDE eclipse
练习的时候尽量使用相同的版本进行选择,避免踩坑。
需求:
用户购买电影票,需要提供用户信息。那么把电影看成一个服务消费者,用户看做一个服务提供者。
我们来快速快速创建两个微服务。
官网:http://start.spring.io/
用户微服务:
如上图填写好之后点击Generate Project便可以生成一个项目压缩包。
电影微服务:
同理,可得项目压缩包。
一、首先编写用户微服务
目录结构:
1、将eclipse环境配好,项目压缩包解压导入到eclipse中,将src/main/resources下的static和templates(做视图用,不需要)删除,新建schema.sql,目的是创建一个user表。
drop table user if exists;create table user(id bigint generated by default as identity,username varchar(40),name varchar(20),age int(3),balance decimal(10,2),primary key(id));
2、新建data.sql,往user表中添加数据
insert into user(id,username,name,age,balance) values(1,'user1','张三',20,100.00);insert into user(id,username,name,age,balance) values(2,'user2','李四',20,100.00);insert into user(id,username,name,age,balance) values(3,'user3','王五',20,100.00);insert into user(id,username,name,age,balance) values(4,'user4','马六',20,100.00);
3、建实体User.java,加上相应注解,以便扫描和数据库做连接。
package com.itmuch.cloud.entity;import java.io.Serializable;import java.math.BigDecimal;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;@Entitypublic class User implements Serializable{/** * */private static final long serialVersionUID = 1L;@Id@GeneratedValue(strategy=GenerationType.AUTO)private Long id;@Columnprivate String username;@Columnprivate String name;@Columnprivate Short age;@Columnprivate BigDecimal balance;public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Short getAge() {return age;}public void setAge(Short age) {this.age = age;}public BigDecimal getBalance() {return balance;}public void setBalance(BigDecimal balance) {this.balance = balance;}}
4、新建UserRepository.java,继承JpaRepository。加上注解,标明其是一个daopackage com.itmuch.cloud.repository;import org.springframework.data.jpa.repository.JpaRepository;import org.springframework.stereotype.Repository;import com.itmuch.cloud.entity.User;@Repositorypublic interface UserRepository extends JpaRepository<User,Long> {}
5、新建UserControllerpackage com.itmuch.cloud.controller;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RestController;import com.itmuch.cloud.entity.User;import com.itmuch.cloud.repository.UserRepository;@RestControllerpublic class UserController {@Autowiredprivate UserRepository userRepository;@GetMapping("/simple/{id}")//@RequestMapping(value="/simple/{id}")public User findById(@PathVariable Long id){return this.userRepository.findOne(id);}}
6、将application.properties改成application.yml进行内容的配置(都是可以的)
application.yml
server: port: 7900spring: jpa: generate-ddl: false show-sql: true hibernate: ddl-auto: none datasource: platform: h2 schema: classpath:schema.sql data: classpath:data.sqllogging: level: root: INFO org.hibernate: INFO org.hibernate.type.descriptor.sql.BasicBinder: TRACE ort.hibernate.type.descriptor.sql.BasicExtractor: TRACE com.itmuch: DEBUG
7、启动项目Run As->Spring Boot App启动成功后,在网页中输入url地址:http://localhost:7900/simple/2
到这里,一个用户微服务成功搞定!
二、电影微服务
目录结构:
1、同理,将src/main/resources下的static和templates(做视图用,不需要)删除
2、新建MovieController.java
package com.itmuch.cloud.controller;import org.springframework.beans.factory.annotation.Autowired;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 com.itmuch.cloud.entity.User;@RestControllerpublic class MovieController {@Autowiredprivate RestTemplate restTemplate;@Value("${user.userServicePath}")private String userServicePath;@GetMapping("/movie/{id}")private User findById(@PathVariable Long id) {return this.restTemplate.getForObject(this.userServicePath+id, User.class);}}
3、新建实体User.java,与用户服务者一样,将jpa注解去掉package com.itmuch.cloud.entity;import java.io.Serializable;import java.math.BigDecimal;public class User implements Serializable{/** * */private static final long serialVersionUID = 1L;private Long id;private String username;private String name;private Short age;private BigDecimal balance;public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Short getAge() {return age;}public void setAge(Short age) {this.age = age;}public BigDecimal getBalance() {return balance;}public void setBalance(BigDecimal balance) {this.balance = balance;}}
4、将application.properties改成application.ymlserver: port: 7901 user: userServicePath: http://localhost:7900/simple/
5、在 MicroserviceSimpleConsumerMovieApplication.java中添加内容
package com.itmuch.cloud;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.context.annotation.Bean;import org.springframework.web.client.RestTemplate;@SpringBootApplicationpublic class MicroserviceSimpleConsumerMovieApplication {@Beanpublic RestTemplate restTemplate(){return new RestTemplate();}public static void main(String[] args) {SpringApplication.run(MicroserviceSimpleConsumerMovieApplication.class, args);}}
6、启动,先启动用户微服务再启动电影微服务,启动成功后,输入url地址:http://localhost:7901/movie/2
到这里,一个简单的微服务就搞定了。
demo分享地址
http://pan.baidu.com/s/1hrBdkTu
总结一下:
1、controller中的注解
1)@RestController是一个组合注解,从4.0开始支持,包含了@Controller和@ResponseBody
2)@GetMapping也是一个组合注解,从4.3开始支持, 包含了RequestMapping(method = RequestMethod.GET)
2、application.yml文件可以看到格式都是竖杠的,以冒号代替properties文件中的逗号,效果是一样的。yml文件有严格缩进,只有属性颜色变成以上绿色时才说明有效,而且属性按着ctrl+鼠标左键可以跳进去
schema和data可以不配,有默认。
3、BigDecimal
1)商业计算使用BigDecimal,要求更高的精度
2)BigDecimal都是不可变的(immutable)的,在进行每一步运算时,都会产生一个新的对象,所以在做加减乘除运算时千万要保存操作后的值。
详情参考博客:http://blog.csdn.net/jackiehff/article/details/8582449
4、@SpringBootApplication扫描的是本目录以及子目录。所以controller应该放在本目录下或者子目录下。
出现问题的博客:http://www.cnblogs.com/oskyhg/p/6683629.html
5、控制台的彩色日志
如果控制台输出日志为彩色,好看是好看,也便于区分,但是需要抽出去放在文件中就会乱码。
所以可以设置将其彩色去掉:
run configuration-->去掉对Enable ANSI console output的勾选
6、在MicroserviceSimpleConsumerMovieApplication.java文件中添加的内容:
@Beanpublic RestTemplate restTemplate(){return new RestTemplate();}和直接声明的效果一样。
private RestTemplate restTemplate = new RestTemplate();
存在的问题:
1、硬编码问题:
电影微服务,调用用户微服务的url地址,将其抽出来放到配置文件中,在一定程度上解决了端口号和ip动态修改的问题。但是如果提供方和消费方过多的话工作量会变得很大。如何解决呢?
2、多个提供者的情况下如何负载?
一半会考虑到用nginx做反向代理,但是一般大型互联网微服务都是成百上千,甚至上万,亚马逊只是首页就有700个微服务,这时候nginx就显得鸡肋了。这时该如何解决呢?
答案:用SpringCloud
敬请期待后面的博客为您解答。。。
- SpringCloud(一):用springboot实现简单服务调用
- SpringCloud 笔记 (一)---- 简单搭建服务注册中心与服务,实现服务注册中心高可用
- sbc(一)SpringBoot+SpringCloud初探
- SpringCloud系列一----SpringBoot入门
- SpringCloud 笔记 (二)---- 简单搭建一个服务消费者,实现简单的ribbon负载均衡
- 非SpringCloud如何调用SpringCloud服务
- SpringCloud(一)构建SpringBoot微服务
- SpringCloud微服务架构搭建(三):服务调用
- SpringCloud-----SpringCloud调用服务时出现重复调用
- springBoot-springCloud
- SpringCloud系列:利用Zuul实现统一服务网关服务,简单实现IP白名单功能
- 简单概述SpringBoot(一)
- SpringCloud-----1、Eureka实现服务治理(Ribbon客户端负载均衡调用服务)
- SpringCloud-----2、Eureka实现服务治理(Feign客户端声明式负载均衡调用服务)
- SpringCloud微服务化(一)-服务注册与发现
- SpringCloud教程一:服务注册与发现(Eureka)
- springcloud(三):服务提供与调用
- springcloud(三):服务提供与调用
- iOS开发中录制视频报错NSInvalidArgumentException
- Ubuntu 使用terminal安装tensorflow,出现的错误锦集
- 原码,补码,反码
- JavaScript事件
- 编译ENB出现protobuf-c错误的解决办法
- SpringCloud(一):用springboot实现简单服务调用
- Spring 系列: Spring 框架简介
- java写出1+...+n=sum的值
- window常用桌面操作快捷键
- 算24点
- springmvc环境
- 移动端页面自适应解决方案 rem布局
- L2-013. 红色警报
- Makefile中的双冒号规则