1. 程式人生 > >SpringCloud(一) 用springboot實現簡單服務呼叫

SpringCloud(一) 用springboot實現簡單服務呼叫

分享一下我老師大神的人工智慧教程吧。零基礎,通俗易懂!風趣幽默!http://www.captainbed.net/

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

環境:

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 userid 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;  @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;@Repositorypublic interface UserRepository extends JpaRepository<User,Long> {}
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;@RestControllerpublic 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: 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 @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 = 1Lprivate 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;@SpringBootApplicationpublic 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的勾選


6、在MicroserviceSimpleConsumerMovieApplication.java檔案中新增的內容:

@Bean public RestTemplate restTemplate() {  return new RestTemplate(); }
和直接宣告的效果一樣。

 private RestTemplate restTemplate = new RestTemplate();

存在的問題:

1、硬編碼問題:

電影微服務,呼叫使用者微服務的url地址,將其抽出來放到配置檔案中,在一定程度上解決了埠號和ip動態修改的問題。但是如果提供方和消費方過多的話工作量會變得很大。如何解決呢?

2、多個提供者的情況下如何負載?

一半會考慮到用nginx做反向代理,但是一般大型網際網路微服務都是成百上千,甚至上萬,亞馬遜只是首頁就有700個微服務,這時候nginx就顯得雞肋了。這時該如何解決呢?

答案:用SpringCloud

敬請期待後面的部落格為您解答。。。


           

給我老師的人工智慧教程打call!http://www.captainbed.net/

這裡寫圖片描述