使用RestTemplate构建简单的微服务

现在有两个角色,服务消费者springcloud-consumer-movie,和服务提供者springcloud-provider-user

总的的思路如下:

user角色整合hibernate自动创建数据库表信息,提供一个通过id查询用户信息的接口@GetMapping("/simple/{id}")

movie角色中也提供一个通过id查询用户信息的接口@GetMapping("/movie/{id}")。该接口的实现是通过RestTemplate调用user角色中的接口路径来完成。


步骤一:建立服务提供者springcloud-provider-user ,首先导入maven项目的pom.xml中的依赖


<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>spring-cloud</groupId>
  <artifactId>springcloud-provider-user</artifactId>
  <version>0.0.1-SNAPSHOT</version>
   <parent>    
       <groupId>org.springframework.boot</groupId>    
       <artifactId>spring-boot-starter-parent</artifactId>    
       <version>1.5.2.RELEASE</version>  
  </parent>     
  <!-- 设置编码以及JDK版本 -->  
  <properties>  
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  
     <java.version>1.8</java.version>  
  </properties>  
    
   <dependencies>    
   <!-- 不加web依赖会出现启动后一段时间自己关闭的现象 -->  
       <dependency>    
           <groupId>org.springframework.boot</groupId>    
           <artifactId>spring-boot-starter-web </artifactId>    
       </dependency>  
       <dependency>    
         <groupId>org.springframework</groupId>    
         <artifactId>spring-webmvc </artifactId>    
       </dependency>    
        <!-- mysql数据库连接驱动-->  
		<dependency>  
		    <groupId>mysql</groupId>  
		    <artifactId>mysql-connector-java</artifactId>  
		</dependency>  
		 
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-solr</artifactId>
		</dependency>
		
		<dependency>
			<groupId>com.h2database</groupId>
			<artifactId>h2</artifactId>
			<scope>runtime</scope>
		</dependency>
		
		
      <!--spring-data-jpa 我们使用jpa方式连接数据库-->  
		 <dependency>  
		    <groupId>org.springframework.boot</groupId>  
		    <artifactId>spring-boot-starter-data-jpa</artifactId>  
		 </dependency>   
       
     <!-- 添加热部署的依赖  spring-boot-devtools 依赖   -->   
        <dependency>    
         <groupId>org.springframework.boot</groupId>    
           <artifactId>spring-boot-devtools</artifactId>    
           <optional>true</optional>    
           <scope>true </scope>    
        </dependency>    
   </dependencies>    
   
 <!-- spring-boot-devtool plugin  -->   
     <build>    
       <plugins>    
         <plugin>    
                 <groupId>org.springframework.boot</groupId>    
                 <artifactId>spring-boot-maven-plugin</artifactId>    
               <configuration>    
                    <fork>true</fork>    
                </configuration>    
          </plugin>    
       </plugins>    
     </build>     
  
</project>

步骤二:编写user方的配置文件。

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.max-active=20  
spring.datasource.max-idle=8
spring.datasource.min-idle=8
spring.datasource.initial-size=10
  
#################  
###Spring jpa  
##################  
  
spring.jpa.database=MYSQL
spring.jpa.show-sql=true 
#spring.jpa.hibernate.ddl-auto=update
spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.ImprovedNamingStrategy  
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect

步骤三:我们需要查询的是一个实体对象,所以我们建立User类,同时通过注解来进行表的自动建立。

package com.cloud.entity;

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 {
	  @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;
	}  
}

步骤四:建立持久层,只需要建立接口继承CrudRepository<User,Long>即可,里面不需要写入查询方法,内部自动封装好了的。

package com.cloud.repository;

import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

import com.cloud.entity.User;

@Repository
public interface UserRepository extends CrudRepository<User,Long>{
  
}

步骤五:编写控制层,编写findById()方法的实现,因为例子比较简单就不写service层的代码了。

扫描二维码关注公众号,回复: 2421431 查看本文章
package com.cloud.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.cloud.entity.User;
import com.cloud.repository.UserRepository;

@RestController
public class UserController{

	@Autowired
	 private UserRepository userRepository ;
	
	//GetMapping注解相当RequestMapping(value="/save",method=RequestMethod.GET)
	@GetMapping("/simple/{id}")  
	public User findById(@PathVariable Long id) {
		return this.userRepository.findOne(id);
	}
}

步骤六:编写data.sql的数据插入语句(这一步可自行去数据库中进行)

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

步骤七:建立启动类(注意启动类要在其他类的包的上一层(最好),或者同一级。)

package com.cloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

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

我们启动访问一下:



步骤八:我们开始建立movie角色,同样上pom.xml依赖导入


<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>springcloud-consumer-movie</groupId>
  <artifactId>springcloud-consumer-movie</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  
   <parent>  
        <groupId>org.springframework.boot</groupId>  
        <artifactId>spring-boot-starter-parent</artifactId>  
        <version>1.5.2.RELEASE</version>  
  </parent> 
  
    <dependencies>
        <!-- web模块 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web </artifactId>
        </dependency>
        
        <dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		
		 <!-- 添加热部署的依赖  spring-boot-devtools 依赖   -->   
        <dependency>    
         <groupId>org.springframework.boot</groupId>    
           <artifactId>spring-boot-devtools</artifactId>    
           <optional>true</optional>    
           <scope>true </scope>    
        </dependency>    
    </dependencies>
  
    <build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>
</project>

步骤九:建立一个不加注解的User实体类

package com.cloud.entity;

import java.math.BigDecimal;

public class User {
	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;
	}
	
}

步骤十:编写配置文件application.yml

server:
  port: 8081
user: 
  userServicePath: http://localhost:8080/simple/

步骤十一:编写启动类,同时引入RestTemplate

package com.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 MovieApplication {
	
	@Bean
	public RestTemplate restTemplate() {
		return new RestTemplate();
	}
	
  public static void main(String[] args) {
	  SpringApplication.run(MovieApplication.class, args);
	  System.out.println("movie消费服务已启动");
  }
}

步骤十二:编写控制层

package com.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.cloud.entity.User;

@RestController
public class MovieController {
	
	@Autowired
    private RestTemplate restTemplate;
	
	//配置文件中指定服务提供方的地址
	@Value("${user.userServicePath}")
	private String userServicePath;
	
	@GetMapping("/movie/{id}")
	public User findById(@PathVariable Long id) {
		return this.restTemplate.getForObject(this.userServicePath+id, User.class);
	}
}

注意:我们要先启动user服务提供方,再启动movie服务消费方





猜你喜欢

转载自blog.csdn.net/sinat_35821285/article/details/80680745
今日推荐