1. 程式人生 > >springboot+springcloud+euruka+feign

springboot+springcloud+euruka+feign

前言:在搭建微服務框架之前,請大家先弄懂springboot以及搭建springboot框架,當然,既然是搭建微服務,當然微服務的概念得搞明白。

OK,話不多說,現在搭框架。

1.在整合springcloud之前,大家得先搭建springboot框架,因為springcloud是基於springboot的。

2.搭建eruka服務,至於eruka的概念,這裡就不多贅言了。

pom如下:

<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">
	<modelVersion>4.0.0</modelVersion>

	<groupId>sbc_service</groupId>
	<artifactId>sbc_service</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>sbc_service</name>
	<url>http://maven.apache.org</url>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>

	<dependencies>

		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>3.8.1</version>
			<scope>test</scope>
		</dependency>

		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-eureka-server</artifactId>
		</dependency>
		<dependency>
			<groupId>ch.qos.logback</groupId>
			<artifactId>logback-classic</artifactId>
			<version>1.2.1</version>
		</dependency>

	</dependencies>
	
	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>Brixton.RELEASE</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>
</project>

3.配置application.properties,配置euruka配置

application.properties配置如下:

#######eureka配置##########
server.port=8888
# 不向註冊中心註冊自己
eureka.client.register-with-eureka=false
# 不需要檢索服務
eureka.client.fetch-registry=false
eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka/

4.編碼註冊中心啟動類

EurekaApplication:

package com.cn;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {

	private final static Logger logger = LoggerFactory.getLogger(EurekaApplication.class);
    public static void main(String[] args) {

        SpringApplication.run(EurekaApplication.class, args);
        logger.info("SpringBoot Start Success");
    }
	
}


6.到此,註冊中心算是搭建完成

7.建立服務者與消費者,個人理解,在編碼中不存在絕對的服務者與消費者,消費者也有可能會是服務者,而服務者也可能會成為消費者,好了,到專案中來,我這裡是先搭建服務者。建立一個springboot專案sbc_order,加入如下依賴包

pom.xml:

<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">
	<modelVersion>4.0.0</modelVersion>

	<groupId>sbc_order</groupId>
	<artifactId>sbc_order</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>sbc_order</name>
	<url>http://maven.apache.org</url>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
		<spring-cloud.version>Dalston.SR3</spring-cloud.version>
		<!--Dalston.SR3 Brixton.SR5 -->
	</properties>

	<!-- Maven POM檔案繼承 spring-boot-starter-parent -->
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.7.RELEASE</version>
		<relativePath /> <!-- lookup parent from repository -->
	</parent>

	<dependencies>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-eureka</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>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<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>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>
</project>

8.在application.properties裡面加入euruka相關配置

application.properties:

####訪問埠#####
server.port=8181

eureka.client.serviceUrl.defaultZone=http://localhost:8888/eureka/
####服務名####
spring.application.name=sbc-order

defaultZone為剛剛euruka註冊中心的地址

9.編寫啟動檔案以及測試用的controller

Start:

package com.cn;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.support.SpringBootServletInitializer;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class Start extends SpringBootServletInitializer {

	public static void main(String[] args) {
        SpringApplication.run(Start.class, args);
    }
	
}

OrderController:

package com.cn.controller;

import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@EnableAutoConfiguration
public class OrderController {

	@RequestMapping("/getOrder")
	@ResponseBody
	public String getOrder() {

		return "ajsdh";
	}
	
}

10.啟動Start,此服務就註冊到euruka註冊中心了


11.服務者做好之後接下來就是消費者了,建立springboot專案,其依賴jar如下

pom.xml:

<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">
	<modelVersion>4.0.0</modelVersion>

	<groupId>sbc_user</groupId>
	<artifactId>sbc_user</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>sbc_user</name>
	<url>http://maven.apache.org</url>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
		<spring-cloud.version>Dalston.SR3</spring-cloud.version>
		<!--Dalston.SR3 Brixton.SR5 -->
	</properties>

	<!-- Maven POM檔案繼承 spring-boot-starter-parent -->
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.7.RELEASE</version>
		<relativePath /> <!-- lookup parent from repository -->
	</parent>

	<dependencies>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-eureka</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>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-ribbon</artifactId>
		</dependency>
		<!--fastjson -->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>fastjson</artifactId>
			<version>1.2.28</version>
		</dependency>

	</dependencies>

	<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>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>
</project>

12.同樣的,在application.properties中引入euruka配置

####訪問埠#####
server.port=8080

eureka.client.serviceUrl.defaultZone=http://localhost:8888/eureka/
####服務名####
spring.application.name=sbc-user

13.因為我這裡是用feign去做為呼叫服務方的方法,則在pom裡面加入下依賴jar

為什麼要用feign,以及feign的優勢這裡就不說,大家自己去google

<!-- fegin -->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-feign</artifactId>
		</dependency>

14.編寫服務方介面

package com.cn.serviceImpl;

import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@FeignClient(name = "sbc-order", fallback = FeginClient.class)
public interface FeginClient {

	@RequestMapping(value = "/getOrder", method = RequestMethod.GET)
	String getOrder();

}

這裡的@FeignClient(name = "sbc-order", fallback = FeginClient.class),name裡面的"sbc-order"為服務方在註冊中心的name,而requestMapping中的value為服務方controller中的mapping


15.編寫啟動類以及controller

Start:

package com.cn;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.support.SpringBootServletInitializer;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.feign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class Start extends SpringBootServletInitializer {

	public static void main(String[] args) {
        SpringApplication.run(Start.class, args);
    }
	
	/*@Bean
    @LoadBalanced
	public RestTemplate restTemplate() {
        return new RestTemplate();
    }*/
	
}

UserControler:

package com.cn.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.client.RestTemplate;

import com.alibaba.fastjson.JSON;
import com.cn.serviceImpl.FeginClient;

@Controller
@EnableAutoConfiguration
public class UserController {

	/*@Autowired
    private RestTemplate restTemplate;*/
	
	@Autowired
    private FeginClient feginClient;
	
	private final static Logger logger = LoggerFactory.getLogger(UserController.class);
	
	@RequestMapping("/getUser")
	@ResponseBody
	public String getUser() {

		 //呼叫遠端服務
//		ResponseEntity<String> responseEntity = restTemplate.getForEntity("http://sbc-order/getOrder", String.class);
//        logger.info("res="+JSON.toJSONString(responseEntity));
		feginClient.getOrder();
		logger.info("res="+JSON.toJSONString(feginClient.getOrder()));
		return "ajsdh";
	}
	
}

注入介面實現類FeginClient,呼叫對應的方法即可

16.啟動Start,部署到註冊中心,然後直接訪問看能不能訪問到sbc-order的介面。



17.一個簡單的分式框架就算是大功告成了。在這個基礎上,大家可以整合redis,swagger等等一系列技術。如果大家有什麼疑問或者有更好的簡潔,歡迎大家加群一起探討。

QQ群:719431817