d該系列項目整體介紹及源代碼請參照前面寫的一篇文章【springcloud學習(dalston.sr1)】項目整體介紹(含源代碼)(一)
?springcloud學習(dalston.sr1)系統文章匯總如下:
【springcloud學習(dalston.sr1)】項目整體介紹(含源代碼)(一)
【springcloud學習(dalston.sr1)】Eureka服務端集群的搭建(含源代碼)(二)
【springcloud學習(dalston.sr1)】Eureka單個服務端的搭建(含源代碼)(三)
【springcloud學習(dalston.sr1)】Eureka 客戶端服務注冊(含源代碼)(四)
【springcloud學習(dalston.sr1)】服務消費者通過restTemplate來訪問服務提供者(含源代碼)(五)
【springcloud學習(dalston.sr1)】Eureka 服務發現(含源代碼)(六)
【springcloud學習(dalston.sr1)】Ribbon負載均衡(含源代碼)(七)
【springcloud學習(dalston.sr1)】使用Feign實現接口調用(含源代碼)(八)
【springcloud學習(dalston.sr1)】Hystrix服務熔斷(含源代碼)(九)
【springcloud學習(dalston.sr1)】Hystrix服務降級(含源代碼)(十)
【springcloud學習(dalston.sr1)】Hystrix Dashboard服務監控(含源代碼)(十一)
【springcloud學習(dalston.sr1)】Zuul路由訪問映射規則配置及使用(含源代碼)(十二)
【springcloud學習(dalston.sr1)】Config配置中心-ConfigServer端與Git通信(含源代碼)(十三)
【springcloud學習(dalston.sr1)】Config配置中心-Configclient端通過和Config server端通信來獲取配置文件信息(含源代碼)(十四)
這篇文章主要介紹Eureka客戶端服務注冊到eureka的server端。
上篇文章【springcloud學習(dalston.sr1)】Eureka單個服務端的搭建(含源代碼)(三)里,我們已經創建好了eureka服務端工程。現在我們來創建一個簡單的eureka客戶端工程。
該項目是一個簡單的spring boot微服務,主要是一個簡單的接口,涉及到數據庫的訪問。通過訪問數據庫的商品表,來查詢一個商品列表,并返回json數據給前端。該模塊會用到microservicecloud-api項目的商品實體類,所以在pom文件中,需要引入該項目的依賴。
需要提前準備好數據庫的一張表,這里我用的是postgres數據庫,創建了一個商品表,包括商品ID和商品名稱兩個字段。如下圖
該項目的整體代碼結構如下:
(一)Eureka客戶端創建
(1)在IEDA中springcloud2015項目下新建一個microservicecloud-provider-8001的模塊,如下圖:
(2)Maven依賴添加
<?xml version="1.0" encoding="UTF-8"?>
<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"><parent><artifactId>springcloud2025</artifactId><groupId>com.company</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>microservicecloud-provider-8001</artifactId><dependencies><dependency><groupId>com.company</groupId><artifactId>microservicecloud-api</artifactId><version>${project.version}</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId></dependency><dependency><groupId>org.postgresql</groupId><artifactId>postgresql</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jetty</artifactId></dependency><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></dependency><!-- 將服務provider注冊進eureka --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId></dependency><!-- actuator監控信息完善 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency></dependencies></project>
可以看到POM文件用到了microservicecloud-api模塊,該模塊結構如下圖:
(3)在application.yml中添加如下配置文件信息
server:port: 8001mybatis:config-location: classpath:mybatis/mybatis.cfg.xml #mybatis配置文件所在路徑type-aliases-package: com.company.api.entity #所有Entity別名類所在包mapper-locations: classpath:mybatis/mapper/*.xml #mapper映射文件spring:application:name: microservicecloud-goodsdatasource:type: com.alibaba.druid.pool.DruidDataSource #當前數據源操作類型driver-class-name: org.postgresql.Driver #postgres驅動包url: jdbc:postgresql://localhost:5432/postgres #數據庫名稱username: postgrespassword: 123456dbcp2:min-idel: 5 #數據庫連接池的最小維持連接數initial-seze: 5 #初始化連接數max-total: 5 #最大連接數max-wait-millis: 200 #等待鏈接獲取的最大超時時間eureka:client: #客戶端注冊進eureka服務列表里service-url:defaultZone: http://localhost:7001/eureka/ #這里填eureka服務端的地址#http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/ #設置與erueka server交互的地址查詢服務和注冊服務,都需要依賴于這個地址instance:instance-id: microservicecloud-goods8001 #這里用于修改eureka服務注冊列表的status字段值,替換默認的展示prefer-ip-address: true #服務注冊列表中的status字段值,其訪問路徑可以顯示IP地址,而不是展示localhostinfo:app.name: company-microservicecloudcompany.name: www.company.combuild.artifactId: $project.artifactId$build.version: $project.version$
(4)創建mybatis mapper xml文件,dao接口,service接口,controller接口,啟動類
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis-org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><settings><setting name="cacheEnabled" value="true"/> <!-- 二級緩存開啟 --></settings>
</configuration>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.company.provider.dao.GoodsDao"><select id="getGoods" resultType="com.company.api.entity.Goods">select good_id as goodId, good_name || '數據庫1' as goodName from public.lc_good limit 5</select>
</mapper>
package com.company.provider.dao;import com.company.api.entity.Goods;
import org.apache.ibatis.annotations.Mapper;import java.util.List;@Mapper
public interface GoodsDao {List<Goods> getGoods();
}
package com.company.provider.service;import com.company.api.entity.Goods;import java.util.List;public interface GoodsService {List<Goods> getGoods();
}
package com.company.provider.service.impl;import com.company.api.entity.Goods;
import com.company.provider.dao.GoodsDao;
import com.company.provider.service.GoodsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class GoodsServiceImpl implements GoodsService {@Autowiredprivate GoodsDao goodsDao;@Overridepublic List<Goods> getGoods() {return goodsDao.getGoods();}
}
package com.company.provider.controller;import com.company.api.entity.Goods;
import com.company.provider.service.GoodsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;@RestController
@RequestMapping("/goods")
public class GoodsController {@Autowiredprivate DiscoveryClient discoveryClient;@Autowiredprivate GoodsService goodsService;@GetMapping("/list")public List<Goods> getGoods() {return goodsService.getGoods();}/*** 服務發現,提供一個接口可以查詢當前組件提供了哪些服務* @return*/@GetMapping("/discovery")public Object discovery() {List<String> services = discoveryClient.getServices();System.out.println("discovery服務列表" + services);List<ServiceInstance> instances = discoveryClient.getInstances("microservicecloud-goods".toUpperCase());instances.forEach(x ->System.out.println("serviceId:" + x.getServiceId()+ ",host:" + x.getHost()+ ",port:" + x.getPort()+ ",uri:" + x.getUri()));return discoveryClient;}
}
package com.company.provider;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;@SpringBootApplication
@EnableEurekaClient //服務啟動后會注冊到eureka服務中
@EnableDiscoveryClient //用于服務發現
public class Provider8001Application {public static void main(String[] args) {SpringApplication.run(Provider8001Application.class, args);}
}
(5)項目整體結構如下(注意:該項目引用的實體類Goods來自于microservicecloud-api項目,文章前面已有提及,并且已在pom文件中進行了引用):
(二)驗證eureka客戶端將服務注冊到eureka服務端的效果。
(1)首先我們啟動eureka服務端EurekaServer7001Application。
(2)啟動完成后,在瀏覽器輸入:http://localhost:7001查看如下,可以看到服務注冊列表為空的。
(3)然后我們啟動eureka客戶端Provider8001Application
(4)啟動完成后,我們首先訪問客戶端的一個接口,以確認客戶端服務是正常的,如下圖。這樣說明結果客戶端服務是正常的。
在瀏覽器輸入http://localhost:8001/goods/list
(5)然后我們在eureka頁面(http://localhost:7001/)刷新該網頁,可以看到該頁面多了一行,說明客戶端已經成功注冊到,并能在服務端看到。如下圖:
(6)需要說明的是如下幾項配置如果不添加,則eureka服務注冊界面的status字段的展示名稱也會有所變化,以及鼠標放上去時,展示的鏈接地址是localhost,而不是IP地址;還有點擊鏈接時會跳轉至錯誤頁,可以自行嘗試下,試試效果