注冊中心配置客戶端(注冊一個虛擬的商品服務)
一、新建項目:
1、創建一個SpirngBoot應用,增加服務注冊和發現依賴
2、模擬商品信息,存儲在內存中
3、開發商品列表接口,商品詳情接口
4、配置文件加入注冊中心地址
二、操作方法:
1、file->new->project
Spring Initializer ->default
點擊next
2、輸入
Group 項目名稱一般為因為小寫字母和數字結合
Artifact 具體組件 小寫字母組合 product_server
Type 選擇 Maven Project
其他的默認
點擊next
3、選擇web
勾選web
3、選擇Cloud Discovery (服務發現)
勾選Eureke Discovery
默認選擇 spring boot版本
點擊next
4、點擊Finish
5、點擊New windows
6、在file下setting-> Maven 設置Maven home directory 設置為maven
User setting file 設置為本地Maven中的setting
7、在新建項目的入口側同時建一個controller(src->main->java->???右鍵點擊)
new->package(命名為controller),再建一個domain包 和一個service包
在controller包下新建一個JAVA Class ,右鍵點擊controller new->class 命名為ProductController
進入JAVA文件
增加兩個引入
@RestController
@RequestMapping("/api/v1/product")
注意:alt+insert 和alt+enter的使用
在domain包下新建一個JAVA Class (實體類),右鍵點擊domain new->class 命名為Product(類名首字母為大寫,對象為駝峰命名方式)
在JAVA類中 product類定義后增加序列化implements Serializable
增加類定義
public Product(){}
public Product( int id ,String name,int price,int store){
this.id=id;
this.name=name;
this.price=price;
this.store=store;
}
輸入商品定義
private int id;
/**
* 商品名稱
*/
private String name;
/**
* 價格 單位為 分
*/
private int price;
/**
* 庫存
*/
private int store;
在下方右鍵,點擊genarate.. 選擇 getter和setter 后選擇所有屬性,點擊OK
在service包下新建一個JAVA Class (實體類),右鍵點擊service new->class 命名為ProductService
進入類中:
修改class 為interface
實現中增加代碼,並增加相應的類(alter+enter)
List<Product> listProduct();
Product findById(int id);
在service包下新建一個impl的包
在impl包下新建一個JAVA Class (實體類),右鍵點擊impl new->class 命名為ProductServiceImpl
進入類中: 加入注解@Service
在class后面輸入 implements ProductService
alt+insert選擇 Override Methods
增加內存數組
private static final Map<Integer, Product> daoMap=new HashMap<>();
static{
Product p1=new Product(1,"iphoneX",2,3);
Product p2=new Product(2,"電腦",2,3);
Product p3=new Product(3,"筆記本",2,3);
Product p4=new Product(4,"音響",2,3);
Product p5=new Product(5,"三體(書)",2,3);
Product p6=new Product(6,"衣架",2,3);
Product p7=new Product(7,"書桌",2,3);
Product p8=new Product(8,"鍋",2,3);
Product p9=new Product(9,"碗",2,3);
Product p10=new Product(10,"瓢",2,3);
Product p11=new Product(11,"盆",2,3);
Product p12=new Product(12,"椅子",2,3);
daoMap.put(p1.getId(),p1);
daoMap.put(p2.getId(),p2);
daoMap.put(p3.getId(),p3);
daoMap.put(p4.getId(),p4);
daoMap.put(p5.getId(),p5);
daoMap.put(p6.getId(),p6);
daoMap.put(p7.getId(),p7);
daoMap.put(p8.getId(),p8);
daoMap.put(p9.getId(),p9);
daoMap.put(p10.getId(),p10);
daoMap.put(p11.getId(),p11);
daoMap.put(p12.getId(),p12);
}
並在獲取商品列表listProduct中增加代碼
Collection<Product> collection=daoMap.values();
List<Product> list=new ArrayList<>(collection)
return list;
在 findById函數中增加;
return daoMap.get(id);
在controller包的類ProductController中增加兩個函數
@Autowired
ProductService productSevice;
/**
* 獲取所有商品列表
* @return
*/
@RequestMapping("list")
public Object list(){
return productSevice.listProduct();
}
/**
* 根據id查看商品詳情
* @param id
* @return
*/
@RequestMapping("findByid")
public Object findByid(@RequestParam("id") int id){
return productSevice.findById(id);
}
運行后驗證
通過這個訪問商品列表
http://localhost:8080/api/v1/product/list
查看id為2的商品詳情
http://localhost:8080/api/v1/product/findByid?id=2
通過后准備注冊Eureka客戶端
8、找到src->main->resources->application.properties修改名為application.yml
右鍵 refactor->rename錄入application.yml
點擊refactor
並在其中增加配置
#服務端口設置
server:
port: 8765
#注冊中心地址
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka
#服務名稱
spring:
application:
name: product-service
9、啟動上次的eurekaserver后啟動本次productservice
http://localhost:8761/打開可以看到服務中增加PRODUCT-SERVER
在啟動一個服務
在product-service項目中運行請修改配置(運行項目左側可以選擇editconfigrations)
將Single instance only的去掉對勾
並在VM option中增加 -Dserver.port=8766
再次啟動項目,在注冊中心中可以看到兩個服務注冊了
10、刪除eureka服務器的報錯
1)、eureka管理后台出現一串紅色字體:是警告,說明有服務上線率低
EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.
關閉檢查方法:eureka服務端配置文件加入
server:
enable-self-preservation: false
注意:自我保護模式禁止關閉,默認是開啟狀態true
2)、為什么只加一個注冊中心地址,就可以注冊,因為有了引用就可以自動注冊
By having spring-cloud-starter-netflix-eureka-client on the classpath, your application automatically registers with the Eureka Server. Configuration is required to locate the Eureka server, as shown in the following example:
11、增加一些配置
在findById中的返回中能夠看到port
ProductController 中增加
@Value("${server.port}")
private String port;
並在findById函數中增加
Product product=productSevice.findById(id);
Product result=new Product();
BeanUtils.copyProperties(product,result);
result.setName(result.getName()+"data from port:"+port);
return result;