springcloud技術組件ribbon+eureka實現服務註冊和負載均衡訪問

如何搭建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、服務均衡訪問的實現別忘了在方法里加上一行內容

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章