如何搭建springcloud的eureka註冊中心和服務提供者以及服務消費者的項目過程文章很多,這裏我只寫過程中遇到的一些問題的解決方式和重要配置
一、eureka的項目搭建
1、配置文件內容,裏面除了數據庫的連接外,就是服務註冊中心的配置,排除註冊自己,以及服務的端口號8761,這裏爲什麼用這個端口號呢,由於測試發現服務提供者在註冊服務的時候只識別這個端口,換成其他端口會啓動報錯,這個抽時間會排除下原因,你知道的話歡迎留言
server.port=8761
#爲了阻止eureka將自己進行進行服務註冊進行下面配置,注意下面寫錯會引起啓動報錯
eureka.instance.hostname=localhost
eureka.instance.prefer-ip-address=true
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.serviceUrl.defalutZone=http://${eureka.instance.hostname}:8761/eureka/
#客戶端向Eureka註冊中心發送心跳的時間間隔,單位爲秒(默認爲30s),(客戶端會按照此規則向Eureka服務端發送心跳檢測包)
eureka.instance.lease-renewal-interval-in-seconds=2
#Eureka註冊中心在收到客戶端最後一次心跳之後等待的時間上限,單位爲秒(默認爲90s),超過時間則剔除(客戶端會按照此規則向Eureka服務端發送心跳檢測包)
eureka.instance.lease-expiration-duration-in-seconds=2
spring.datasource.url=jdbc:mysql://localhost:3306/mi_db?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=dhj393339
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
mybatis.typeAliasesPackage=com.example.demo.model
#解決實體類使用駝峯命名法與數據庫帶下劃線的命名不同的問題
mybatis.configuration.mapUnderscoreToCamelCase=true
pom.xml文件重點注意內容如下,重點注意這兩段,不同的springcloud版本的寫法上會有不同,我的事2.1.X版本
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
剩下的就是啓動類的註解
@EnableEurekaServer//Eureka啓動服務註冊
@SpringBootApplication
public class SpringcloudApplication {
public static void main(String[] args) {
SpringApplication.run(SpringcloudApplication.class, args);
}
}
就這麼多內容即可跑起來
二、服務提供者的配置搭建
配置文件內容如下里面內容不多解釋,稍微接觸下就知道大概意思:
server.port=9090
#serverTimezone=UTC用來解決mysql時區和中國時區的衝突報錯
spring.datasource.url=jdbc:mysql://localhost:3306/mi_db?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=dhj393339
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
mybatis.typeAliasesPackage=com.example.demo.model
#解決實體類使用駝峯命名法與數據庫帶下劃線的命名不同的問題
mybatis.configuration.mapUnderscoreToCamelCase=true
#服務命名
spring.application.name=msg-service
eureka.client.serviceUrl.defalutZone=http://localhost:8761/eureka/
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true
#客戶端向Eureka註冊中心發送心跳的時間間隔,單位爲秒(默認爲30s),(客戶端會按照此規則向Eureka服務端發送心跳檢測包)
eureka.instance.lease-renewal-interval-in-seconds=2
#Eureka註冊中心在收到客戶端最後一次心跳之後等待的時間上限,單位爲秒(默認爲90s),超過時間則剔除(客戶端會按照此規則向Eureka服務端發送心跳檢測包)
eureka.instance.lease-expiration-duration-in-seconds=2
pom.xml文件內容注意事項,下面兩段配置根據自己版本定
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
啓動類注意事項
@SpringBootApplication(exclude = {SecurityAutoConfiguration.class})//說明的括號內是不啓動安全驗證的
@EnableSwagger2
@MapperScan("com.mi.msg.mapper")
@EnableEurekaClient
public class MiApplication {
public static void main(String[] args) {
SpringApplication.run(MiApplication.class, args);
}
}
被調用的方法如下,需要寫到你自己的controller類裏,我下面註釋你會發現實現get請求的兩種註解方式,這個困擾我很多時間,總是提示訪問不了註冊中心的這個服務,網上總是說註冊名不能有下劃線,除了這個原因之外總算髮現了@RequestMapping實現的get方法是不能被調用的,用@GetMapping是可以的,這裏重點強調一下,原因嗎那就是底層請求類型影響的:
@ApiOperation(value = "eureka服務註冊測試類", notes = "實現springcloud eureka註冊測試") //標註在方法:用以備註接口描述
@GetMapping("/test")
//@RequestMapping(value = "/test",method = RequestMethod.GET)//在負載均衡時此配置調用不到
public String eureka() {
System.out.println("hello world");
return "hello world";
}
三、服務消費者的項目搭建
配置文件內容下
server.port=9092
#serverTimezone=UTC用來解決mysql時區和中國時區的衝突報錯
spring.datasource.url=jdbc:mysql://localhost:3306/mi_db?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=dhj393339
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
mybatis.typeAliasesPackage=com.example.demo.model
#解決實體類使用駝峯命名法與數據庫帶下劃線的命名不同的問題
mybatis.configuration.mapUnderscoreToCamelCase=true
eureka.client.serviceUrl.defaultZone= http://localhost:8761/eureka/
spring.application.name=springcloud-customer
#msg-service.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
要解釋的也沒有,容易理解,下面是pom文件重點注意內容
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
<!--spring cloud 雲服務-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
下面是啓動類的內容、
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
public class SpringcloudCustomApplication {
public static void main(String[] args) {
SpringApplication.run(SpringcloudCustomApplication.class, args);
}
@Bean
@LoadBalanced
RestTemplate restTemplate() {
return new RestTemplate();
}
@Bean
public IRule ribbonRule() {
return new RandomRule();//這裏配置策略,和配置文件對應
}
}
接下來是服務消費方法
private static final Logger logger = LoggerFactory.getLogger(Controller.class);
@Autowired
RestTemplate restTemplate;
@Autowired
LoadBalancerClient loadBalancerClient;
public String port() {
//ServiceInstance serviceInstance= this.loadBalancerClient.choose("msg-service");
//System.out.println("服務獲取"+serviceInstance.getHost()+":"+serviceInstance.getPort());
this.loadBalancerClient.choose("msg-service");//隨機訪問策略
String info =this.restTemplate.getForEntity("http://msg-service/test", String.class).getBody();
return info;
}
@RequestMapping(value = "/test",method = RequestMethod.GET)
public String showInfol(){
System.out.println("find port");
logger.info("find port");
return port();
}
這裏有個注意點,就是在方法內容如果不加入
this.loadBalancerClient.choose("msg-service");//隨機訪問策略
就會發現只調用其中一個服務提供者,沒有實現均衡訪問
這裏試試貼出來部分代碼,主要是體現幾個遇到的問題
1、服務註冊時目前只做到了註冊eureka的8761接口,其他接口目前失敗,在解決
2、服務消費去調用服務提供者時失敗,原因是get的註解方式不同
3、服務均衡訪問的實現別忘了在方法里加上一行內容