SpringCloud(一) 用springboot實現簡單服務呼叫
分享一下我老師大神的人工智慧教程吧。零基礎,通俗易懂!風趣幽默!http://www.captainbed.net/
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
環境:
SpringBoot 1.4.1
Mavan 3.2.3
JDK 1.8
IDE eclipse
練習的時候儘量使用相同的版本進行選擇,避免踩坑。
需求:
使用者購買電影票,需要提供使用者資訊。那麼把電影看成一個服務消費者,使用者看做一個服務提供者。
我們來快速快速建立兩個微服務。
使用者微服務:
如上圖填寫好之後點選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; @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。加上註解,標明其是一個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、新建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 = 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;@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
敬請期待後面的部落格為您解答。。。