微服务常用注解、配置文件与注意事项

一、版本锁定

 

方式一(不推荐):

该方法不利于继承。

<parent>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-parent</artifactId>
   <version>2.3.8.RELEASE</version>
</parent>

方式二:

推荐,因为该方式可以进行多继承。

<dependencyManagement>
            <dependencies>
                <!-- 指定当前项目的父项目:spring-boot-dependencies-->
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-dependencies</artifactId>
                    <version>2.3.8.RELEASE</version>
                    <!-- pom 表示当前项目是一个父项目 -->
                    <type>pom</type>
                    <!-- import 表示导入当前项目的pom.xml配置-->
                    <scope>import</scope>
                </dependency>
            </dependencies>
</dependencyManagement>


二、Ribbon配置

1、配置类

@Bean
@LoadBalanced
public RestTemplate restTemplate(){
  return new RestTemplate();
}


三、OpenFeign配置

1、OpenFeign基础配置

(1)pom.xml依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

(2)注解

@EnableDiscoveryClient
让该服务放入注册中心注册并从注册中心获取其他服务。

@EnableDiscoveryClient

@EnableFeignClients
启动OpenFeign的服务

@EnableFeignClients

2、OpenFeign日志的配置

(1)配置类

该配置类应写在启动类内部。写在调用者内部

@Bean
public Logger.Level loggerLevel(){
    return Logger.Level.FULL;
}

(2)pom.xml配置

com.wnxy写的是扫描的包和debug写的是打印的等级。写在调用者内部

logging:
  level:
    com.wnxy: debug

3、OpenFeign其它配置

(1)服务调用者超时配置

feign:
  client:
    config:
      default:
        # 连接超时
        connectTimeout: 1000
        # 业务处理超时
        readTimeout: 3000

(2)服务调用者重试配置

该配置写在启动类中。

   @Bean
    public Retryer feignRetryer() {
        return new Retryer.Default();
    }

(3)负载均衡

随机负载均衡

    @Bean
    public IRule rules(){
        return new RoundRobinRule();
    }

(4)其他配置

cinema-member-service:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
    OkToRetryOnAllOperations: false  # true 对所有请求 get ,post,put ,delete等都进行重试,false 只针对get请求重试。
    MaxAutoRetriesNextServer: 1  # 切换实例次数
    MaxAutoRetries: 1  #切换实例后重试次数


四、Eureka注册中心

 1、Eureka基础配置

(1)父项目

1.pom.xml依赖

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Hoxton.SR9</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

(2)eureka服务端

1.pom.xml依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
</dependencies>

2.application.yml配置文件

server:
  port: 8761
eureka:
  client:
    #Eureka客户端向Eureka服务端进行注册的地址。
    service-url:
      defaultZone: http://localhost:8761/eureka
    #不向注册中心注册自己
    register-with-eureka: false
    #不从注册中心拉取服务
    fetch-registry: false
spring:
  application:
    # 向注册中心进行注册的服务名称
    name: eureka-server

3.注解

启动类上写这个注解开启eureka服务

@EnableEurekaServer

2、Eureka注册认证

(1)注册中心的配置

1.依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

2.application.yml配置文件

spring:
  application:
    # 向注册中心进行注册的服务名称
    name: eureka-server
  security:
    user:
      name: nie
      password: 123456

3.配置类

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().ignoringAntMatchers("/eureka/**");
        super.configure(http);
    }
}

(2)服务端的配置

1.application.yml配置文件

@前面的nie:123456是你写的密码

eureka:
  client:
    service-url:
      defaultZone: http://nie:123456@localhost:8761/eureka

五、Hystrix降级

1、普通降级

(1)pom.xml依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

(2)注解

@EnableCircuitBreaker

写在启动类上,开启熔断机制。

@EnableCircuitBreaker

 @DefaultProperties(defaultFallback = "errorFallback")

 写在业务类上,调用熔断方法,defaultFallback = "errorFallback"便是熔断方法。

@DefaultProperties(defaultFallback = "errorFallback")

@HystrixCommand

该注解写在需要使用熔断的方法上,以便进行熔断。

@HystrixCommand  

(3)application.yml配置文件

feign:
  hystrix:
    enabled: true

(4)降级方法

@RestController
@RequestMapping("portal/fegin")
@Slf4j
@DefaultProperties(defaultFallback = "errorFallback") // 指定降级方法
public class PortalOpenFeginController {
    @Autowired
    private MemberFeignClient memberFeignClient;
    @GetMapping("member/{mid}")
    public String findMemberById(@PathVariable("mid")String mid) {
        return memberFeignClient.findOne(mid);
    }
    @GetMapping("timeout") // 超时报错方法,也是访问方法
    @HystrixCommand           // 熔断降级注解
    public String findTimeout() {
        return memberFeignClient.findFeginTimeout();
    }
    // 降级方法,返回string
    public String errorFallback(){
        return "默认降级方法";
    }
}

2、接口降级

(1)编写回调方法

@Component
public class MemberFeignFallback implements MemberFeignClient{
    @Override
    public String findOne(String mid) {
        return "根据id查询出现异常,此时服务降级,调用降级方法,id:"+mid;
    }
    @Override
    public String findFeginTimeout() {
        return "超时异常,进行服务降级,调用降级方法";
    }
}

(2)fegin接口中指定回调

@FeignClient(value = "cinema-member-service",fallback = MemberFeignFallback.class)
public interface MemberFeignClient {}

(3)删除@DefaultProperties@HystrixCommand

3、熔断

(1)注解

@HystrixCommand

该注解定义了熔断中的许多属性。

  @HystrixCommand(fallbackMethod = "errorFallback",commandProperties = {
            // 是否开启断路器
            @HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_ENABLED,value = "true"),
            // 请求错误率大于 50% 就启动熔断器
            @HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_ERROR_THRESHOLD_PERCENTAGE,value = "50"),
            // 默认10秒内访问接口失败达到20次,打开断路器,触发熔断; 为了方便测试,这里修改10秒内错误达到10次触发熔断。
            @HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_REQUEST_VOLUME_THRESHOLD,value = "10"),
            //断路多久以后开始尝试是否恢复,默认5s
            @HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_SLEEP_WINDOW_IN_MILLISECONDS,value = "10000")
    })

(2)完整熔断类

    @GetMapping("find/{id}")
    @HystrixCommand(fallbackMethod = "errorFallback",commandProperties = {
            // 是否开启断路器
            @HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_ENABLED,value = "true"),
            // 请求错误率大于 50% 就启动熔断器
            @HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_ERROR_THRESHOLD_PERCENTAGE,value = "50"),
            // 默认10秒内访问接口失败达到20次,打开断路器,触发熔断; 为了方便测试,这里修改10秒内错误达到10次触发熔断。
            @HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_REQUEST_VOLUME_THRESHOLD,value = "10"),
            //断路多久以后开始尝试是否恢复,默认5s
            @HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_SLEEP_WINDOW_IN_MILLISECONDS,value = "10000")
    })
    public String findMemberById(@PathVariable("id")Integer id) {
        if (id<0) {
            throw new RuntimeException("id不能为负数");
        }
        return Thread.currentThread().getName() + " 调用成功";
    }
    // 默认降级方法,返回string
    public String errorFallback(@PathVariable("mid")Integer mid){
        return "默认降级方法";
    }

4、服务监控

(1)监控端

1.创建监控项目

2.pom.xml依赖

<dependencies>
    <!--配置hystrix dashboard-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
    </dependency>
</dependencies>

3.application.yml配置文件

server:
  port: 9002
hystrix:
  dashboard:
    proxy-stream-allow-list: "*"

4.启动类

@SpringBootApplication
@EnableHystrixDashboard
public class HystrixApplication {
    public static void main(String[] args) {
        SpringApplication.run(HystrixApplication.class, args);
    }
}

(2)服务端

1.pom.xml依赖

<dependency>
     <groupId>com.netflix.hystrix</groupId>
     <artifactId>hystrix-metrics-event-stream</artifactId>
</dependency>

2.配置类

该配置类写在启动类上

  @Bean
    public ServletRegistrationBean getServlet() {
        HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
        ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);
        registrationBean.setLoadOnStartup(1);
        registrationBean.addUrlMappings("/hystrix.stream");
        registrationBean.setName("HystrixMetricsStreamServlet");
        return registrationBean;
    }

3.访问hystrix监控中心

http://localhost:9002/hystrix


六、网关

1、路由配置

(1)pom.xml依赖

因为网关需要在eureka中进行注册,因此既需要eureka客户端的依赖。

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

(2)application.yml配置文件

server:
  port: 10000
spring:
  application:
    name: gateway
  cloud:
    gateway:
      routes:
        - id: api-member-service
          uri: http://localhost:9000
          predicates:
            - Path=/member/**
eureka:
  client:
    service-url:
      defaultZone: http://jet:123@localhost:8761/eureka,http://jet:123@localhost:8762/eureka

2、断言配置

(1)application.yml配置文件

方法断言

server:
  port: 1000
spring:
  application:
    name: gateway
  cloud:
    gateway:
      routes:
        - id: api-member-service
          uri: http://localhost:9000
          predicates:
            - Method=get

时间 断言 

spring:
	application:
		name: gateway
	cloud:
		gateway:
			routes:
				- id: api-member-service
				  uri: http://localhost:9000
				  predicates:
					- After=2022-06-30T14:15:00+08:00[Asia/Shanghai]

权重断言

	spring:
		  application:
			name: gateway
		  cloud:
			gateway:
			  routes:
				- id: api-member-high
				  uri: http://localhost:8999
				  predicates:
					- Weight=group1,8
				- id: api-member-low
				  uri: http://localhost:9000
				  predicates:
					- Weight=group1,2

3、动态路由配置

spring:
	  application:
		name: gateway
	  cloud:
		gateway:
		  routes:
			- id: api-member-high
			  uri: lb://cinema-member-service
			  predicates:
				- Path=/member/**

4、过滤器配置

		spring:
		  application:
			name: gateway
		  cloud:
			gateway:
			  routes:
				- id: api-member-high
				  uri: lb://cinema-member-service
				  predicates:
					- Method=get
				  filters:
					- PrefixPath=/member

5、网关集成Hystrix降级熔断

(1)pom.xml依赖

	<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
	</dependency>

(2)降级类


		@RestController
		public class FallbackController {

			@GetMapping("/fallback")
			public Map<String,Object> fallback(){
				Map<String,Object> map = new HashMap<>();
				map.put("code",500);
				map.put("message","服务不可用");
				return map;
			}
		}

(3)application.yml配置文件

此处fallbackUri: forward:/fallback中forward后面的配置要和上面@GetMapping里面的值相同。而name: fallbackcmd是写死的不能进行更改。

spring:
		  application:
			name: gateway
		  cloud:
			gateway:
			  routes:
				- id: api-member-high
				  uri: lb://cinema-member-service
				  predicates:
					- Path=/member-service/**
				  filters:
					- StripPrefix=1
					- name: Hystrix
					  args:
						name: fallbackcmd
						fallbackUri: forward:/fallback

6、超时降级配置

spring:
			  application:
				name: gateway
			  cloud:
				gateway:
				  routes:
					- id: api-member-high
					  uri: lb://cinema-member-service
					  predicates:
						- Path=/member-service/**
					  filters:
						- StripPrefix=1
						- name: Hystrix
						  args:
							name: fallbackcmd
							fallbackUri: forward:/fallback
				  httpclient:
					connect-timeout: 1000    # 建立连接的超时时间
					response-timeout: 5000   # 响应的超时时间(处理业务的超时时间)			
			hystrix:
			  command:
				default:
				  execution:
					isolation:
					  thread:
						timeoutInMilliseconds: 5000  # hystrix线程隔离超时时间,默认是1秒

7、Gateway 限流    

(1)pom.xml依赖

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>

(2)配置类

@Configuration
			public class RatelimitConfig {
				/**
				 * 根据IP限流,即以每秒内请求数按IP分组统计,超出限流的url请求都将返回429状态
				 */
				@Bean
				public KeyResolver ipKeyResolver(){
				   return new KeyResolver() {
					   @Override
					   public Mono<String> resolve(ServerWebExchange exchange) {
						   //获取请求的IP地址
						   String hostName = exchange.getRequest().getRemoteAddress().getHostName();
						   //创建Mono发布者对象,发布数据源
						   return Mono.just(hostName);
					   }
				   };
				}
			}

(3)application.yml配置文件

注意:这里的key-resolver: "#{@ipKeyResolver}",中注入的内容需要和上面@Bean中方法名相同。

spring:
			  application:
				name: gateway
			  redis:
				host: localhost
				port: 6379
			  cloud:
				gateway:
				  routes:
					- id: api-member-high
					  uri: lb://cinema-member-service
					  predicates:
						- Path=/member-service/**
					  filters:
						- StripPrefix=1
						- name: Hystrix
						  args:
							name: fallbackcmd
							fallbackUri: forward:/fallback
							
						- name: RequestRateLimiter #限流过滤器
						  args:
							#每秒补充1个,令牌桶每秒填充平均速率, 允许用户每秒处理多少个请求。
							redis-rate-limiter.replenishRate: 1
							#令牌桶总容量,每秒最大处理的请求数量
							redis-rate-limiter.burstCapacity: 3
							#限流策略,通过SpEL从容器中获取对象
							key-resolver: "#{@ipKeyResolver}"

8、跨域请求

(1)配置类

添加一下配置类即可。

@Configuration
public class CorsFilter {
    // 跨域:协议、主机、端口三者有一个不一样,就产生跨域。
    @Bean
    public CorsWebFilter corsFilter() {
        CorsConfiguration config = new CorsConfiguration();
        config.addAllowedMethod("*");
        config.addAllowedOrigin("*");
        config.addAllowedHeader("*");
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());
        source.registerCorsConfiguration("/**", config);
        return new CorsWebFilter(source);
    }
}

七、配置中心

配置中心的操作都是基于一下原理图进行操作的,如果对下面的内容有不理解的地方可以看看这张图片就可以理解了。

1、基础配置

(1)配置中心

1.创建git仓库

注意事项:

1、仓库名称需要和服务名称相同

2、配置文件的名称=服务名称-环境名称.yml

2.添加依赖

<dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
</dependencies>

3.启动类上增加注解

开启配置中心

@EnableConfigServer

开启eureka客户端

@EnableDiscoveryClient

4、配置application.yml文件 

server:
  port: ${port:8500}
spring:
 application:
    name: config-server
 cloud:
  config:
    server:
      git:
        uri: https://gitee.com/q1756336885/{application}
        username: 用户名
        password: 密码
eureka:
  client:
    service-url:
      defaultZone: http://jet:123@localhost:8761/eureka,http://jet:123@localhost:8762/eureka

(2)客户端

1.添加依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-config</artifactId>
</dependency>

2.新建bootstrap.yml配置文件,并添加配置

spring:
  application:
    name: cinema-member-service
  cloud:
    config:
#      name: cinema-member-service	  # 对应的是微服务名称,gitee上的文件名称的一部分
      profile: dev					  # 激活的配置,与上面的name拼接共同构造了完整的配置文件名
      label: master					  # git 上的分支名称
      uri: http://localhost:8500,http://localhost:8501     # 配置中心服务端地址,就是config-server地址

2、配置参数刷新

(1)添加依赖(客户端)

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

(2)配置bootstrap.yml文件

添加如下配置,和spring配置是平行的。

management:
  endpoints:
    web:
      exposure:
        include: 'refresh'

(3)添加刷新类

@RestController
@RequestMapping("refresh")
@RefreshScope
public class RefreshController {
    @Value("${title}")
    private String title;
    @GetMapping("/test")
    public String test() {
        return title;
    }
}

(4)发送指令进行刷新

用post方法发送一下请求即可进行更新。

http://localhost:9000/actuator/refresh

3、重试配置

(1)添加依赖(客户端)

<dependency>
    <groupId>org.springframework.retry</groupId>
    <artifactId>spring-retry</artifactId>
</dependency>

(2)配置bootstrap.yml文件

spring:
  cloud:
    config:
      label: master  #分支名称
      uri: http://localhost:8000 #配置中心微服务访问地址
      name: order-service #微服务的ID
      profile: dev  #环境名称
      fail-fast: true #快速失败,进行重试
      retry:
        initial-interval: 5000 #初始间隔时间  
        max-interval: 30000 #最大间隔时间
        max-attempts: 5 # 重试次数
        multiplier: 2 #重试间隔时间倍数

八、Nacos

1、配置中心

(1)父项目依赖

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.3.8.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>2.2.2.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

(2)子项目依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

(3)子项目yml配置

spring:
  application:
    name: user-service
  cloud:
    nacos:
      config:
        server-addr: localhost:8848
        file-extension: yaml
        #group: PROD_GROUP
        namespace: d0e6b5b6-0240-4373-90df-7da6bacb2571
  profiles:
    active: dev #配置环境

(4)配置持久化

spring.datasource.platform=mysql

### Count of DB:
db.num=1

### Connect URL of DB:
db.url.0=jdbc:mysql://xxx.xx.46.177:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=用户名
db.password.0=密码

2、注册中心

(1)依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

(2)yml配置

spring:
  application:
    name: user-service
  cloud:
    nacos:
      config:
        server-addr: localhost:8848
        file-extension: yaml
        namespace: 114a64ad-2756-4642-b60b-f61de4c9d6f3
  profiles:
    active: prod/test/dev #配置不同环境分别启动

3、网关配置

(1)父项目依赖

 <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.3.8.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.2.2.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--  添加SpringCloud版本锁定 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR9</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

(2)网关依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
</dependencies>

(3)启动类

@SpringBootApplication
@EnableDiscoveryClient
public class GatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
    }
}

(5)yml依赖

spring:
  application:
    name: gateway-server
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
        namespace: 114a64ad-2756-4642-b60b-f61de4c9d6f3
        group: PROD_GROUP
    gateway:
      routes:
        - id: user-service-api
          uri: lb://user-service
          predicates:
            - Path=/us/**
          filters:
            - StripPrefix=1
server:
  port: 9000

(6)负载均衡配置类

@Bean
public IRule loadBalanceRule(){
    return new NacosRule();
}

4、持久化实例管理

(1)配置持久实例

spring:
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
        namespace: 114a64ad-2756-4642-b60b-f61de4c9d6f3
        group: PROD_GROUP
        ephemeral: false # 持久化节点
  application:
    name: user-service

(2)删除方法

利用postman发送一下请求即可

localhost:8848/nacos/v1/ns/instance?serviceName=user-service&groupName=PROD_GROUP&ip=192.168.3.131&port=8886&clusterName=DEFAULT&namespaceId=57bb4bb9-8f8c-47a9-bffd-9134ad2fbefc&ephemeral=false

5、集群配置

(1)集群配置文件

首先我们进入conf目录下,默认只有一个cluster.conf.example文件,我们需要自行复制一份,修改名称为cluster.conf。每行配置成ip:port。(请配置3个或3个以上节点)

#it is ip
#example
127.0.0.1:8849
127.0.0.1:8851
127.0.0.1:8853

(2)application.properties配置文件

分别修改每个nacos服务的application.properties配置文件中服务的端口

erver.port=8849/8851/8853
nacos.inetutils.ip-address=127.0.0.1

(3)以集群的方式启动nacos

startup.cmd -m cluster

(4)网关配置

spring:
  application:
    name: gateway-server
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8849,localhost:8851,localhost:8853 # 集群配置
        namespace: 114a64ad-2756-4642-b60b-f61de4c9d6f3
        group: PROD_GROUP
    gateway:
      routes:
        - id: user-service-api
          uri: lb://user-service
          predicates:
            - Path=/us/**
          filters:
            - StripPrefix=1
server:
  port: 9000

九、Sentinel

(1)基础配置

1.依赖

 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

2.yml配置

server:
  port: 8000
spring:
  application:
    name: sentinel-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 # 注册中心的地址
    sentinel:
      transport:
        dashboard: localhost:8080 # sentinel仪表盘的地址
management:
  endpoints:
    web:
      exposure:
        include: '*' #对外暴露的检查项

(2)流量控制

1.链路控制

yml配置

server:
  port: 8000
spring:
  application:
    name: sentinel-service
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8080
      web-context-unify: false  #配置为 false 即可根据不同的URL 进行链路限流
management:
  endpoints:
    web:
      exposure:
        include: '*'

链路接口

@RestController
public class HelloController {
    @Autowired
    private MyServiceImpl myService;
    @GetMapping("/check")
    public String check(){
        return myService.doSomething();
    }
    @GetMapping("/check1")
    public String check1(){
        return myService.doSomething();
    }
}

(3)降级配置

1.普通方法

@Component
public class UrlBlockHandler implements BlockExceptionHandler {
    @Override
    public void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, BlockException e) throws Exception {
        String msg = null;
         if(e instanceof FlowException){
            msg = "接口被限流";
        }else if(e instanceof DegradeException){
            msg = "接口被熔断,稍后再试";
        }else if(e instanceof ParamFlowException){
            msg = "热点参数限流";
        }else if(e instanceof SystemBlockException){
            msg = "系统规则限流";
        }else if(e instanceof AuthorityException){
            msg = "系统授权限流";
        }
        httpServletResponse.setStatus(500);
        httpServletResponse.setCharacterEncoding("utf-8");
        httpServletResponse.setContentType("application/json;charset=utf-8");
        ObjectMapper mapper = new ObjectMapper();
        Map map = new HashMap<>();
        map.put("code",500);
        map.put("message",msg);
        mapper.writeValue(httpServletResponse.getWriter(),map);
    }
}

2.OpenFeign 接口

1、服务提供者

@RestController
@RequestMapping("user")
public class UserController {
    @GetMapping("{id}")
    public String findUserById(@PathVariable("id") Integer userId){
        System.out.println("用户ID:"+userId);
        return "用户信息:"+userId;
    }
}

2、开发服务消费端

依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

yml

server:
  port: 9000
spring:
  application:
    name: portal-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
    sentinel:
      transport:
        dashboard: localhost:8080
feign:
  sentinel:
    enabled: true #开启OpenFeign基于Sentinel的限流熔断

启动类

@SpringBootApplication
@EnableFeignClients
public class PortalApplication {
    public static void main(String[] args) {
        SpringApplication.run(PortalApplication.class, args);
    }
}

调用接口

@FeignClient("user-service")
public interface UserFeginClient {
    @GetMapping("/user/{id}")
    String findUserById(@PathVariable("id") Integer userId);
}

controller层

@RestController
@RequestMapping("/portal")
public class PortalController {
    @Autowired
    private UserFeginClient userFeginClient;
    @GetMapping("{userId}")
    public String findOne(@PathVariable("userId") Integer userId) {
        return userFeginClient.findUserById(userId);
    }
}

降级类

@Component
public class UserFeignClientFallback implements UserFeginClient {
    @Override
    public String findUserById(Integer userId) {
        return "服务降级方法";
    }
}

将降级类写在接口上

@FeignClient(value = "user-service",fallback = UserFeignClientFallback.class)
public interface UserFeginClient {
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小海海不怕困难

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值