SpringCloud(一):用springboot实现简单服务调用

环境:

SpringBoot 1.4.1

Mavan 3.2.3

JDK 1.8 

IDE eclipse

练习的时候尽量使用相同的版本进行选择,避免踩坑。

需求:

用户购买电影票,需要提供用户信息。那么把电影看成一个服务消费者,用户看做一个服务提供者。

SpringCloud(一):用springboot实现简单服务调用_第1张图片

我们来快速快速创建两个微服务。

官网:http://start.spring.io/

用户微服务:

SpringCloud(一):用springboot实现简单服务调用_第2张图片

如上图填写好之后点击Generate Project便可以生成一个项目压缩包。

电影微服务:

SpringCloud(一):用springboot实现简单服务调用_第3张图片

同理,可得项目压缩包。

一、首先编写用户微服务

目录结构:

SpringCloud(一):用springboot实现简单服务调用_第4张图片

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;



@Entity
public class User implements Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	private Long id;
	
	@Column
	private String username;
	
	@Column
	private String name;
	
	@Column
	private Short age;
	
	@Column
	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、新建UserRepository.java,继承JpaRepository。加上注解,标明其是一个dao

package com.itmuch.cloud.repository;


import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;


import com.itmuch.cloud.entity.User;


@Repository
public interface UserRepository extends JpaRepository {


}
5、新建UserController

package 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;

@RestController
public class UserController {
	@Autowired
	private 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: 7900
spring:
  jpa:
    generate-ddl: false
    show-sql: true
    hibernate:
      ddl-auto: none
  datasource:
    platform: h2
    schema: classpath:schema.sql
    data: classpath:data.sql
logging:
  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


到这里,一个用户微服务成功搞定!

二、电影微服务

目录结构:

SpringCloud(一):用springboot实现简单服务调用_第5张图片

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;

@RestController
public class MovieController {
	@Autowired
	private 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.yml

server:
  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;

@SpringBootApplication
public class MicroserviceSimpleConsumerMovieApplication {

	@Bean
	public 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的勾选

SpringCloud(一):用springboot实现简单服务调用_第6张图片

6、在MicroserviceSimpleConsumerMovieApplication.java文件中添加的内容:

@Bean
	public RestTemplate restTemplate()
	{
		return new RestTemplate();
	}
和直接声明的效果一样。

 private RestTemplate restTemplate = new RestTemplate();

存在的问题:

1、硬编码问题:

电影微服务,调用用户微服务的url地址,将其抽出来放到配置文件中,在一定程度上解决了端口号和ip动态修改的问题。但是如果提供方和消费方过多的话工作量会变得很大。如何解决呢?

2、多个提供者的情况下如何负载?

一半会考虑到用nginx做反向代理,但是一般大型互联网微服务都是成百上千,甚至上万,亚马逊只是首页就有700个微服务,这时候nginx就显得鸡肋了。这时该如何解决呢?

答案:用SpringCloud

敬请期待后面的博客为您解答。。。


你可能感兴趣的:(★架构)